fork() 创建子进程(一):父子进程时间片轮转抢夺CPU

本文探讨了fork函数创建子进程的机制,通过两个代码示例展示了父进程和子进程执行次序的不确定性,特别是在引入sleep函数调节进程调度后的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动机

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.

重定向与否,输出结果有差异,暂时没有想明白为什么。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值