0
int main()
{
    ...
    if(!fork())
        {
            execvp(cmdName,cmdParam);
        }
    printf("In main()...");
return(0);
}
  1. 假设我已经正确传递了 cmdName 和 cmdParam 参数,我该如何等待 execvp 创建的进程完成,然后再继续执行 main()?
  2. execvp() 是否创建了一个作为新 fork() 进程的子进程的进程?
4

4 回答 4

3

如前所述,您需要保存 fork 调用的值。你真的应该在叉子上使用更多的 if 。有以下三种情况:

  1. 0:你是子进程
  2. 0:你是父母并得到了一个孩子的PID

  3. -1:发生了可怕的事情,fork 失败了

你真的很想知道案例3,它会毁了你一整天。(也是 exec 调用)

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);}

于 2010-09-03T17:32:36.210 回答
3
  1. 在父进程中,fork返回子进程的PID,所以你可以将它存储在一个变量中,然后waitpid用来等待子进程终止。

  2. 并非如此 - 创建的新子进程fork是父进程的副本,execvp然后将其进程映像替换为新映像。实际上,您最初有两个父程序的“副本”,然后其中一个“成为”新程序。

于 2010-09-03T17:16:00.613 回答
3

对于你的第一个问题:

像这样使用 waitpid(2):

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

对于第二部分:所有 exec 函数调用都接管了进程(它们都不返回)

于 2010-09-03T17:18:10.467 回答
1

您需要存储 的返回值fork(),它为每个可执行文件返回不同的值(如果您是子 PID,则为 0,如果您是父级),然后您需要执行waitpid

于 2010-09-03T17:16:22.390 回答