动机
fork 创建子进程,注意父进程子进程的执行次序。
父子进程时间片轮转抢夺CPU 。
父进程,子进程,哪个先抢到CPU,哪个先执行。
示例2里面,让父进程sleep(1)
休眠1秒,就子进程先输出了。
示例1:父进程先输出
代码示例
/*fork_parent_first.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main() {
pid_t child;
if ((child=fork()) == -1) { // 创建失败
printf("Fork Error.\n");
}
if (child == 0) {
// 子进程
printf("Now it is in child process. I am %d.\n", getpid());
exit(0);
}
else {
// 父进程
printf("Now it is in parent process. I am %d.\n", getpid());
wait();
}
}
运行结果:父进程先输出
Now it is in parent process. I am 8139.
Now it is in child process. I am 8140.
示例2:子进程先输出
代码示例
父进程加入代码 sleep(1)
,使父进程放慢抢夺CPU的机会。
/*fork_child_first.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main() {
pid_t child;
if ((child=fork()) == -1) { // 创建失败
printf("Fork Error.\n");
}
if (child == 0) {
// 子进程
printf("Now it is in child process. I am %d.\n", getpid());
exit(0);
}
else {
// 父进程
sleep(1); //请注意,此处语句与否,执行结果的不同。
printf("Now it is in parent process. I am %d.\n", getpid());
wait();
}
}
运行结果:子进程先输出
Now it is in child process. I am 8159.
Now it is in parent process. I am 8158.
不确定
对于示例1,也就是父进程先输出的情况,如果在执行时,重定向输出,如:
./fork_child_first > out.txt
在输出文件out.txt
里,结果为子进程先输出:
Now it is in child process. I am 8140.
Now it is in parent process. I am 8139.
重定向与否,输出结果有差异,暂时没有想明白为什么。