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

时间:2014-01-13 09:11:44

标签: c linux exec

我编写了这个必须执行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的第二个参数。

2 个答案:

答案 0 :(得分:1)

在开关中的每个案例后添加中断指令。

答案 1 :(得分:1)

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

您还需要在break语句中的案例之间使用switch语句,否则当您执行第一个案例时,它将继续,并且也会在第二个案例中继续。

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

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