C

时间:2018-10-17 15:44:03

标签: c process fork system

我正在遵循的系统编程过程中有以下代码:

/* 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.

有人可以向我解释为什么这段代码不能继续创建流程吗

1 个答案:

答案 0 :(得分:1)

do {
    pid = fork();
} while ((pid == -1) && (errno == EAGAIN));

假设对fork的调用成功,则仅被调用一次。因此,仅创建一个新过程。然后,子级呼叫child_process,而父级呼叫father_process。之后,它们都返回到main函数,在这里它们从switch语句中退出并从main返回。