4

我的教授在 C 中展示了以下示例:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main() {
   pid_t pid;

   /* fork another process */
   pid = fork();
   if (pid < 0) { /* error occurred */
         fprintf(stderr, "Fork Failed");
         return 1;
   }
   else if (pid == 0) { /* child process */
         execlp("/bin/ls", "ls", NULL);
   }
   else { /* parent process */
        /* parent will wait for the child */
        wait (NULL);
        printf("Child Completed its execution\n");
   }

return 0;
}

我编译并运行它。我在这段代码中看到了一个奇怪的行为:

打印“ls”程序/命令的结果,它在 else if 条件中,但也打印了字符串“Child Completed its execution\n”,它在 else 中。

这不是一种奇怪的行为吗?

4

2 回答 2

5

不,你把它分叉了。有两个进程正在运行。一个报告了 ls,另一个报告了 printf()。

具体来说,子进程/分叉进程执行 /bin/ls,父进程调用 printf(),即您看到的输出。

于 2013-01-31T17:05:08.030 回答
2

这是因为fork创建了一个子进程,它从代码中的同一点继续执行,但pid设置为 0。您看到的是父进程执行该printf行,而子进程正在执行ls命令。

于 2013-01-31T17:05:32.320 回答