首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分叉系统调用是如何工作的?

分叉系统调用是如何工作的?
EN

Unix & Linux用户
提问于 2017-03-09 15:10:30
回答 1查看 2.8K关注 0票数 4

我有一个关于分叉系统呼叫的非常具体的问题。我有一段代码:

代码语言:javascript
复制
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;
}

它产生这个输出:

代码语言:javascript
复制
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

这让我想知道叉子到底是如何工作的,以及真正执行了哪些代码新进程。看上面的输出结果,我不明白:

  1. 在完成所有迭代之前,循环打印的第二步是如何进行的?我还注意到,第二个for总是由父进程执行,这使我怀疑在第一个周期中,if pid != 0 (即父进程调用)是否被执行(?)
  2. 为什么子进程没有按PID排序?

所以,底线是,叉子是如何工作的,谁来执行什么?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2017-03-09 15:18:33

当您使用fork时,内核创建一个新进程,它是分叉进程的副本,两个进程都在fork之后继续执行(返回代码显示是否发生错误,以及正在运行的代码是父进程还是子进程)。这个“继续执行”部分不一定立即发生:内核只是将新进程添加到运行队列中,它最终将被调度并运行,但不一定立即执行。

这解释了你问的这两种行为:

  • 由于新进程不一定会立即调度,因此在任何子进程有机会运行之前,父进程可能会继续运行;
  • 创建顺序在运行队列中没有太大(如果有的话)影响,因此不能保证子进程将按照创建的顺序运行。
票数 9
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/350301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档