# 管道：复习题

> 原文：<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`使用管道来控制创建的每个子进程的输入和输出。当输出包含`-`时，打印最终输出行（整个游戏序列和结果）并退出。