Skip to content

Files

Latest commit

8284d54 · Jul 11, 2019

History

History
39 lines (30 loc) · 1.94 KB

87.md

File metadata and controls

39 lines (30 loc) · 1.94 KB

管道:复习题

原文:https://github.com/angrave/SystemProgramming/wiki/Pipe%3A-Review-Questions

问题编号可能会有变化

Q1

填写空白以使下面的程序打印 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;
}

Q2

使用 POSIX 调用fork pipe dup2close来实现自动编程程序。将子进程的标准输出捕获到管道中。子进程应该exec程序./test没有其他参数(进程名称除外)。在父进程中从管道读取:一旦捕获的输出包含!就退出父进程!字符。在退出父进程之前,将 SIGKILL 发送到子进程。如果输出包含!,则退出 0。否则,如果子进程退出导致管道写入结束,则退出值为 1.确保在父进程和子进程中关闭管道的未使用端

Q3(高级)

这个高级挑战使用管道让“AI 玩家”自己玩,直到游戏完成。程序tictactoe接受一行输入 - 到目前为止的转弯顺序,打印相同的顺序,然后再转动,然后退出。使用两个字符指定转弯。例如,“A1”和“C3”是两个相对的角位置。字符串B2A1A3是 3 转/ plys 的游戏。有效响应是B2A1A3C1(C1 响应阻止对角线 B2 A3 威胁)。输出行还可以包含后缀-I win -You win -invalid-draw使用管道来控制创建的每个子进程的输入和输出。当输出包含-时,打印最终输出行(整个游戏序列和结果)并退出。