原文:https://github.com/angrave/SystemProgramming/wiki/Pipe%3A-Review-Questions
问题编号可能会有变化
填写空白以使下面的程序打印 123456789.如果cat
没有参数,它只是打印输入直到 EOF。奖金:解释为什么下面的close
电话是必要的。
int main() {
int i = 0;
while(++i < 10) {
pid_t pid = fork();
if(pid == 0) { /* child */
char buffer[16];
sprintf(buffer, ______,i);
int fds[ ______];
pipe( fds);
write( fds[1], ______,______ ); // Write the buffer into the pipe
close( ______ );
dup2( fds[0], ______);
execlp( "cat", "cat", ______ );
perror("exec"); exit(1);
}
waitpid(pid, NULL, 0);
}
return 0;
}
使用 POSIX 调用fork
pipe
dup2
和close
来实现自动编程程序。将子进程的标准输出捕获到管道中。子进程应该exec
程序./test
没有其他参数(进程名称除外)。在父进程中从管道读取:一旦捕获的输出包含!就退出父进程!字符。在退出父进程之前,将 SIGKILL 发送到子进程。如果输出包含!,则退出 0。否则,如果子进程退出导致管道写入结束,则退出值为 1.确保在父进程和子进程中关闭管道的未使用端
这个高级挑战使用管道让“AI 玩家”自己玩,直到游戏完成。程序tictactoe
接受一行输入 - 到目前为止的转弯顺序,打印相同的顺序,然后再转动,然后退出。使用两个字符指定转弯。例如,“A1”和“C3”是两个相对的角位置。字符串B2A1A3
是 3 转/ plys 的游戏。有效响应是B2A1A3C1
(C1 响应阻止对角线 B2 A3 威胁)。输出行还可以包含后缀-I win
-You win
-invalid
或-draw
使用管道来控制创建的每个子进程的输入和输出。当输出包含-
时,打印最终输出行(整个游戏序列和结果)并退出。