【问题标题】:How many process are created in this program?在这个程序中创建了多少进程?
【发布时间】:2013-11-01 05:31:36
【问题描述】:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
    int i = 3;
    int pid;
    while(i > 0) {
        pid = fork();
        if(pid > 0) {
            exit(0);
        } else {
            i--;
        }
    }
}

在那个程序上创建了多少进程???我仍然对 fork() 系统调用感到困惑,有人可以帮我解释一下吗?

【问题讨论】:

    标签: c process operating-system posix


    【解决方案1】:

    fork() 是做什么的?

    fork() 是一个有趣的电话。您可以将其视为将程序的状态克隆为两个完全相同的副本——它们之间的唯一区别将是fork() 的返回值。执行fork() 的进程会收到新​​进程的进程id (pid),而新进程会收到0

    考虑到这一点:

    创建了多少进程?

    每次 fork 时,都会创建一个新进程并退出父进程。因此,您这样做了三次——通过分叉创建了三个进程。当然,这不包括您通过启动该过程开始的那个。 :)

    【讨论】:

    • 谢谢我现在完全理解为什么、如何以及何时使用 fork() 系统调用创建进程:)
    • 我还有一个问题,如果我将 [i--] 语句从子进程移动到父进程,进程会等于零吗?还是程序执行无限循环?
    • 不,答案将保持不变:创建了三个进程,只要您保持答案不变。现在这里有一个问题:注释掉exit(0)——那么创建了多少进程?
    • 如果我注释掉exit(0)语句,我想它也会执行父进程,所以总进程变成8个?
    • 如果你注释掉exit(0),它会无限期地继续分叉(试试吧……小心!)现在:如果你用for(i=3;i&gt;0;i--) fork();替换那个循环会发生什么?
    【解决方案2】:
    1. 在程序启动期间,系统会创建 1 个进程 (+1)
    2. i=3,程序创建新进程 (+1),父进程退出,子进程继续
    3. i=2,程序创建新进程 (+1),父进程退出,子进程继续
    4. i=1,程序创建新进程 (+1),父进程退出,子进程继续
    5. i=0,程序退出

    所以,总共 - 4 个进程,3 个由程序创建,1 个由系统创建

    【讨论】:

    • 谢谢我现在完全理解为什么、如何以及何时使用 fork() 系统调用创建进程:)
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多