在主要等待execvp

时间:2010-09-03 17:08:50

标签: c linux process execvp

int main()
{
    ...
    if(!fork())
        {
            execvp(cmdName,cmdParam);
        }
    printf("In main()...");
return(0);
}
  1. 假设我已正确传递cmdName& cmdParam参数,在恢复执行main()之前,如何等待execvp创建的进程完成?
  2. execvp()是否创建了一个进程,该进程是新fork()ed进程的子进程?

4 个答案:

答案 0 :(得分:3)

  1. 在父进程中,fork返回子进程的PID,因此您可以将其存储在变量中,然后使用waitpid等待子进程终止。

  2. 不是真的 - fork创建的新子进程与父进程重复,然后execvp将其进程映像替换为新映像。实际上,你最初有父母的两份“副本”,其中一份然后“成为”新程序。

答案 1 :(得分:3)

关于你的第一个问题:

像这样使用waitpid(2):

int pid = fork();
if (!pid)
  {
    execvp(cmdName, cmdParam);
  }
waitpid(pid, NULL, 0);
printf("Resuming main()...\n");

对于第二部分:所有exec函数调用都将进行处理(没有一个返回)

答案 2 :(得分:3)

如上所述,您需要保存fork调用的值。你应该在fork上使用多个if。有三种情况:

  1. 0:你是孩子的过程
  2.   

    0:你是父母并且让孩子PID回来了

  3. -1:发生了可怕的事情,叉子失败了
  4. 你真的想知道案例3,它会破坏你的一整天。 (也是执行官的电话)

    int main() {
      int pid = fork();
      if(-1 == pid) {
         fprintf(stderr, "Big problems forking %s\n", strerror(errno);
         exit(-1);//or whatever
      }
      else if (0 == pid) {
        if (-1 == execvp(cmdName,cmdParam)) {
          //like above, get some output about what happened
        }
      }
      //no need to else here, execvp  shouldn't return 
      // if it does you've taken care of it above
      waitpid(pid, NULL, 0);
      printf("Resuming main()...");
    }
    

    返回(0); }

答案 3 :(得分:1)

你需要存储fork()的返回值,它为每个可执行文件返回一个不同的值(如果你是父节点,如果你是子PID,则为0),然后你需要做一个{{1 }}