C - 为什么我的程序执行扫描和打印两次



我编写这个程序,它必须执行mkdir和rmdir,父级必须向子级发送参数,子级执行它。

void main()
{
  int r; 
  int i;
  int fd[2];
  pipe(fd);
  char arg[100];
  printf("Please Choose one of the following commands: n");
  printf("1 MKDIR n");
  printf("2 RMDIR n");
  while(1)
  {
    printf("You choose: n");
    scanf("%d ", &r);
    pid_t pid;
    pid = fork();
    printf("Please enter arguments: ");
    scanf("%s ", arg);
    write(fd[1],arg,sizeof(arg));
    for(i=0;i<4;i++)
    {
      if(pid==0)
      {
        switch(r)
        {
          case 1: 
          read(fd[0],arg,sizeof(arg));
          execl("/bin/mkdir", "MKDIR", arg, NULL);
          case 2: 
          read(fd[0],arg,sizeof(arg));
          execl("/bin/rmdir", "RMDIR", arg, NULL);
        }
      }
      break;
    }
  }
}

问题是当我执行它时,我需要扫描 r 两次,然后它重复请输入参数两次,它执行 r 的第二个参数。

在开关中的每种情况之后添加中断指令。

请记住,子进程在fork调用后直接开始执行代码,这意味着父进程和子进程都将调用scanf。您需要在fork调用后直接检查您是在子进程还是父进程中。

您还需要在switch语句中的案例之间有一个break语句,否则当您执行第一种情况时,它将继续下去,并且也会持续到第二个情况。

还有一个问题是子进程永远不会退出,而是继续无限循环。子进程完成后,它应该exit

还创建了许多"已失效"的流程,因为您永远不会为子流程wait。你需要调用wait函数(或其相关函数之一,如waitpid)来"收获"孩子。否则,即使进程处于暂停状态,该过程仍将存在。

最新更新