多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 管道:复习题 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Pipe%3A-Review-Questions> > 问题编号可能会有变化 ## Q1 填写空白以使下面的程序打印 123456789.如果`cat`没有参数,它只是打印输入直到 EOF。奖金:解释为什么下面的`close`电话是必要的。 ```c 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; } ``` ## Q2 使用 POSIX 调用`fork` `pipe` `dup2`和`close`来实现自动编程程序。将子进程的标准输出捕获到管道中。子进程应该`exec`程序`./test`没有其他参数(进程名称除外)。在父进程中从管道读取:一旦捕获的输出包含!就退出父进程!字符。在退出父进程之前,将 SIGKILL 发送到子进程。如果输出包含!,则退出 0。否则,如果子进程退出导致管道写入结束,则退出值为 1.确保在父进程和子进程中关闭管道的未使用端 ## Q3(高级) 这个高级挑战使用管道让“AI 玩家”自己玩,直到游戏完成。程序`tictactoe`接受一行输入 - 到目前为止的转弯顺序,打印相同的顺序,然后再转动,然后退出。使用两个字符指定转弯。例如,“A1”和“C3”是两个相对的角位置。字符串`B2A1A3`是 3 转/ plys 的游戏。有效响应是`B2A1A3C1`(C1 响应阻止对角线 B2 A3 威胁)。输出行还可以包含后缀`-I win` `-You win` `-invalid`或`-draw`使用管道来控制创建的每个子进程的输入和输出。当输出包含`-`时,打印最终输出行(整个游戏序列和结果)并退出。