Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fork()在进程执行结束后输出_C_Fork - Fatal编程技术网

C fork()在进程执行结束后输出

C fork()在进程执行结束后输出,c,fork,C,Fork,考虑以下代码段: int main() { fork(); fork(); fork(); printf("Hello World\n"); } 我正在获得输出:[ubuntu 12.04] aashish@aashish-laptop:~$ ./a.out Hello World Hello World Hello World aashish@aashish-laptop:~$ Hello World <-------------------------

考虑以下代码段:

int main()
{
    fork();
    fork();
    fork();
    printf("Hello World\n");
}
我正在获得输出:[ubuntu 12.04]

aashish@aashish-laptop:~$ ./a.out
Hello World
Hello World
Hello World
aashish@aashish-laptop:~$ Hello World <---------------------------
Hello World
Hello World
Hello World
Hello World
aashish@aashish-笔记本电脑:~$/a.out
你好,世界
你好,世界
你好,世界

aashish@aashish-笔记本电脑:~$Hello World第二个shell提示符后的“Hello World”输出来自分叉进程,而不是shell(您)启动的进程。

这是因为您生成了1个分叉(2),然后再次分叉(4),然后再次分叉(8),然后为每个分叉打印Hello World。这就是为什么有8个输出。

intmain(){
int main() {
    pid_t c[3];
    int i, n = 0;
    for (i = 0; i < 3; ++i) {
        switch ((c[n] = fork())) {
        case 0:  break;
        case -1: perror("fork"); exit(EXIT_FAILURE);
        default: ++n;
        }
    }
    printf("[%d] Hello World\n", (int)getpid());
    // Without waiting, some children may still be running when the
    // parent exits. This makes it look like output is generated
    // after the process is over, when in fact not all the processes
    // are done yet.
    //
    // The process is not really finished until its children are
    // finished. The wait call waits on a child process to finish.
    for (i = 0; i < n; ++i) wait(0);
    return 0;
}
pid_t c[3]; int i,n=0; 对于(i=0;i<3;++i){ 开关((c[n]=fork()){ 案例0:断裂; 案例1:perror(“fork”);退出(退出失败); 默认值:++n; } } printf(“[%d]Hello World\n”,(int)getpid()); //没有等待,一些孩子可能仍然在跑步,当 //父级退出。这使它看起来像是生成了输出 //过程结束后,实际上并不是所有的过程 //我们已经完成了。 // //直到它的子进程完成,这个过程才真正结束 //已完成。等待调用等待子进程完成。 对于(i=0;i
简单的回答是,您正在创建多个进程,它们彼此异步运行。答案如下:

在shell提示下键入./a.out时,将创建一个运行程序的进程。让我们称之为过程1

进程1调用fork()。这将创建一个新的子进程,即进程2,在第一个fork()调用之后,1和2都将继续执行,并继续执行第二个fork()调用。流程1创建子流程3,流程2创建子流程4。所有四个进程都从第二个fork()之后开始,一直到最后一个fork()调用。过程1创建过程5;过程2创建过程6;过程3创建过程7;过程4创建过程8

请注意,这些进程编号是任意的:不能保证它们会按该顺序创建

第一个fork()执行后,异步就开始发挥作用。该系统不保证将父对象与子对象安排在一起。理论上,子级可以在父级继续之前运行到完成,父级可以在子级获得任何资源之前完成。最有可能的场景位于中间:原始进程与其子进程共享资源,以便所有进程同时运行

谜题的最后一部分是因为shell正在等待进程1完成。只有流程1。shell不知道(或关心)进程1已经启动了其他进程。因此,当进程1完成时,shell将显示一个提示。碰巧,进程1的一些子进程还没有到达printf()语句。当他们到达那里时,炮弹已经显示了它的提示


为了进一步探讨这一点,您可能希望尝试将fork()调用更改为printf(“%d\n”,fork());和/或将printf(“Hello World\n”)更改为printf(“Hello from pid%d\n”,getpid())

可能是因为当该进程退出时,另一个进程正在从fork运行,该进程仍在输出。这个问题重复了这么多次。。。每天……严格来说,
fork()
当然不会输出任何东西。由
fork()
创建的各种进程在退出前输出一行。有时,顶级进程(初始进程)在其一些子进程之前完成,因此子进程在shell编写下一个命令的提示符后编写输出。如果您希望父级在退出前等待(
waitpid()
wait()
)直到其子级死亡,则必须对其进行编码。您可以/应该在打印信息中包含PID(
getpid()
);它将帮助您了解发生了什么。您的答案是准确的,但它不能解释为什么在初始进程退出并且shell编写了下一个提示符之后会出现一些输出。