我有一个关于分叉系统呼叫的非常具体的问题。我有一段代码:
int main (void)
{
for (int i = 0; i < 10; i++) {
pid_t pid = fork ();
if ( !pid ) {
printf("CHILD | PID: %d, PPID: %d\n", getpid(), getppid());
_exit(i + 1);
}
}
for (int i = 0; i < 10; i++) {
int status;
waitpid(-1, &status, 0);
if (WIFEXITED(status)) {
printf("IM %d AND CHILD WITH EXIT CODE %d TERMINATED\n",
getpid(), WEXITSTATUS(status));
}
else {
printf("ERROR: CHILD NOT EXITED\n");
}
}
return 0;
}它产生这个输出:
CHILD | PID: 3565, PPID: 3564
CHILD | PID: 3566, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 1 TERMINATED
IM 3564 AND CHILD WITH EXIT CODE 2 TERMINATED
CHILD | PID: 3573, PPID: 3564
CHILD | PID: 3567, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 9 TERMINATED
IM 3564 AND CHILD WITH EXIT CODE 3 TERMINATED
CHILD | PID: 3568, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 4 TERMINATED
CHILD | PID: 3569, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 5 TERMINATED
CHILD | PID: 3570, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 6 TERMINATED
CHILD | PID: 3571, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 7 TERMINATED
CHILD | PID: 3572, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 8 TERMINATED
CHILD | PID: 3574, PPID: 3564
IM 3564 AND CHILD WITH EXIT CODE 10 TERMINATED这让我想知道叉子到底是如何工作的,以及真正执行了哪些代码新进程。看上面的输出结果,我不明白:
if pid != 0 (即父进程调用)是否被执行(?)发布于 2017-03-09 15:18:33
当您使用fork时,内核创建一个新进程,它是分叉进程的副本,两个进程都在fork之后继续执行(返回代码显示是否发生错误,以及正在运行的代码是父进程还是子进程)。这个“继续执行”部分不一定立即发生:内核只是将新进程添加到运行队列中,它最终将被调度并运行,但不一定立即执行。
这解释了你问的这两种行为:
https://unix.stackexchange.com/questions/350301
复制相似问题