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编写了下一个提示符之后会出现一些输出。