如何正确fork()一个进程

时间:2014-11-14 22:00:00

标签: c fork execvp

我试图了解如何正确使用fork()execvp()来执行命令。到目前为止,我有以下代码:

当我运行./test vim myFile.c时,它正确打开myFile.c,但我的行为很奇怪。好像有两个进程在运行,因为每当我输入任何内容时,它似乎都会发生两次。这是为什么?

int main (int argc, char* argv[]) {
   int fdin, pid, w, status; 
   fdin = 0;                                                                   
   if ((pid = fork()) < 0)                                                     
       errorExit (EXIT_FAILURE);                                                                                                                              
   execvp(argv[0],argv);  

   do {
      w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
      if (w == -1) {
          perror("waitpid");
          exit(EXIT_FAILURE);
      }

     if (WIFEXITED(status)) {
          printf("exited, status=%d\n", WEXITSTATUS(status));
      } else if (WIFSIGNALED(status)) {
          printf("killed by signal %d\n", WTERMSIG(status));
      } else if (WIFSTOPPED(status)) {
          printf("stopped by signal %d\n", WSTOPSIG(status));
      } else if (WIFCONTINUED(status)) {
          printf("continued\n");
      }
  } while (!WIFEXITED(status) && !WIFSIGNALED(status))
}

3 个答案:

答案 0 :(得分:3)

您的计划中的父母和子女都会获得execvp()

if ((pid = fork()) < 0)
    errorExit (EXIT_FAILURE);
execvp(argv[0],argv);

如果您与父母pid != 0在一起,您应该检查,如果您还是孩子,则应该检查。

答案 1 :(得分:3)

当您调用fork()时,您将创建两个几乎完全相同的进程,父进程和子进程。这两个进程之间的唯一区别是fork()的返回值,它返回0到子进程,子进程的pid返回到父进程。

因此,假设fork成功,fork将向第4行中的父进程和子进程返回一个非负整数。然后,父进程和子进程将执行第6行execvp,因此,最终得到两个运行你的vim myFile.c的不同进程,导致你描述的所有问题。

标准习语就像:

if ((pid = fork()) < 0) {
    // Handle fork error
}
else if (pid == 0) {
    // Child process
    execvp(...);
}
else {
    // Parent process
    w = waitpid(pid, ...);
}

由于fork的返回值为0,因此在fork成功后,对于子进程,test(pid == 0)将为true,因此将调用execvp。

对于父级,fork返回子级的pid,因此仍然执行的检查(pid == 0)为false,因此执行else条件,导致父级等待子级。 / p>

答案 2 :(得分:0)

你应该查看fork的返回值,在成功的fork之后,你将在程序中的相同位置有两个正在运行的进程。子进程的返回值为0,父进程将得到一个返回值,即子进程的pid。很可能你想在子进程和父进程中做不同的事情。

您可能还想再次考虑如何调用execvp。你真的想给#34; ./ test&#34;作为execvp的第一个参数?