我正在遵循的系统编程过程中有以下代码:
/* La fonction create_process duplique le processus appelant et retourne
le PID du processus fils ainsi créé */
pid_t create_process(void)
{
/* On crée une nouvelle valeur de type pid_t */
pid_t pid;
/* On fork() tant que l'erreur est EAGAIN */
do {
pid = fork();
} while ((pid == -1) && (errno == EAGAIN));
/* On retourne le PID du processus ainsi créé */
return pid;
}
/* La fonction child_process effectue les actions du processus fils */
void child_process(void)
{
printf(" We are in the son's process !\n"
" son's pid is est %d.\n"
" son's PPID is %d.\n", (int) getpid(), (int) getppid());
}
/* La fonction father_process effectue les actions du processus père */
void father_process(int child_pid)
{
printf(" We are in the father process !\n"
" son's PID is %d.\n"
" father's PID is %d.\n", (int) child_pid, (int) getpid());
}
int main(void)
{
pid_t pid = create_process();
switch (pid) {
/* Si on a une erreur irrémédiable (ENOMEM dans notre cas) */
case -1:
perror("fork");
return EXIT_FAILURE;
break;
/* Si on est dans le fils */
case 0:
child_process();
break;
/* Si on est dans le père */
default:
father_process(pid);
break;
}
return EXIT_SUCCESS;
}
该函数的输出为:
我们正在父亲的过程中! 儿子的PID是6246。 父亲的PID是6245。 我们正在儿子的过程中! 儿子的PID是6246。 儿子的PPID为1。
我不明白为什么这段代码会产生以下输出: 函数create_process从父进程派生一个新进程。因此,在父进程中,函数create_process返回child_process pid,我了解第一部分:
We are in the father's process!
son's PID is 6246.
father's PID is 6245.
然后我猜child_process正在执行,并且create_process函数返回0,因为我们现在在child_process中,并且我也理解以下输出:
We are in the son's process!
son's PID is 6246.
son's PPID is 1.
但是我不明白为什么在那之后执行会停止……我们仍在分支子进程吗?因此,我认为应该继续创建新流程并进行打印:
We are in the son's process !
son's PID is OTHER.
son's PPID is 6246.
有人可以向我解释为什么这段代码不能继续创建流程吗
答案 0 :(得分:1)
do {
pid = fork();
} while ((pid == -1) && (errno == EAGAIN));
假设对fork
的调用成功,则仅被调用一次。因此,仅创建一个新过程。然后,子级呼叫child_process
,而父级呼叫father_process
。之后,它们都返回到main
函数,在这里它们从switch
语句中退出并从main
返回。