这是给出的代码示例:
# include <stdio.h>
# include <unistd.h>
void main() {
static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
int display(char *), i;
for (i=0; i<10; ++i)
display(mesg[i]);
sleep(2);
}
int display(char *m) {
char err_msg[25];
switch (fork()) {
case 0:
execlp("/bin/echo", "echo", m, (char *) NULL);
sprintf (err_msg, "%s Exec failure", m);
perror(err_msg); return(1);
case -1:
perror ("Fork failure"); return(2);
default:
return(0);
}
}
现在,在运行这个程序之前我的假设是父母会在孩子之前完成。所以我的预期输出是
0
1
2
3
4
5
6
7
8
9
但是,每次运行该程序时,我都会得到随机的进程顺序。我的问题是“为什么?”。是因为处理器会在进程之间跳转的“上下文切换”吗?是不是某些进程比其他进程获得更多的“资源分配”?父进程和子进程的顺序不是一成不变的吗?这就是为什么我们有僵尸进程和孤儿进程?
答案1
一旦您 fork() ,子进程就开始运行,实际上它们甚至没有“启动”,它们只是在 fork() 调用后继续在代码中运行,就像父进程一样。只是fork()的返回值不同。父母和孩子可以按任意顺序退出。所以是的,上下文切换将使所有进程随机执行。
当子进程退出并且父进程没有正确“获取”子进程退出代码时,您将获得僵尸进程。僵尸进程基本上只包含尚未检索的退出代码,每次看到这些退出代码时,都会责怪父进程不小心。 (僵尸是父进程中的一个错误,除非父进程是短暂的并且不需要照顾。)如果父进程在子进程之前退出,则子进程将被重新设置为 PID 1,这将执行退出代码收获。 (它还会清理进程中的所有僵尸。)