我用C编写了如下代码
#include<stdio.h>
#include<unistd.h>
int main()
{
int id;
id = fork();
if(id == 0)
printf("Child Processn");
else if(id > 0)
printf("Parent Processn");
else
perror("Unable to forkn");
return 0;
}
输出如ubuntu 20 OS 所示
Parent Process
Child Process
我希望子进程应该首先被写入,因为在fork((被调用后,子进程的printf((将被打印在屏幕上,之后父进程的printf((将打印出来,但实际上是反向打印的。请帮助我为什么不首先打印子进程的printf((,因为在子进程中id为0。
进程可以按任意顺序运行,因为它们是独立调度的(正如Jonathan Leffler在评论中所说(,并且通常也在不同的CPU内核中运行。把它们想象成两个不同的浏览器窗口,可以同时播放视频/音频。
如果您有任何数据,子进程必须在父进程读取之前插入,则sleep(1);
可能是fork();
之后的父进程。(或任何其他原因(。
理论上,即使父进程等待1秒,也不能保证子进程会在父进程之前运行。
此外,为什么希望子进程在父进程之前运行?
这不是像当我们调用fork((时,控件转到子进程,在子进程执行完其指令后,控件回到父进程。这种行为的原因就像c从上到下一个接一个地执行它的指令。我是不是错过了什么?
这是一个不同的过程!!!一旦子进程启动,它就有了一个完全不同的执行线程,fork((返回到父进程,子进程自己运行。这就是为什么当您在父进程上调用exit(1);
时,子进程不会退出。
正如siride所建议的:你可以使用wait()
,如果你想让父进程只在子进程之后运行,就使用这个:
#include <stdio.h>
#include <unistd.h>
int main()
{
int id;
id = fork();
if(id == 0) {
printf("Child Processn");
} else if(id > 0) {
wait(id); // waits until child process finishes doing its work
printf("Parent Processn");
} else {
perror("Unable to forkn");
}
return 0;
}