【操作系统】7/35进程原语2

本文探讨了写时复制机制在单进程模式下如何避免不必要的内存拷贝,并深入解析了waitpid函数在进程回收中的作用及其实现方式,特别是非阻塞回收方案的应用。

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

读时共享写时复制

单进程模式,一个父进程,父子进程映射就可以了,不需要共享。

不需要拷贝可以。可以直接用。

如果对子进程进行修改,一定是会断掉映射的。

修改了,就进行拷贝。

如果父进程修改了呢?

父进程修改时,要维护子进程的修改副本,因此,父进程修改的时候,也出发写拷贝。

否则会出现,父进程一直随着子进程在变化。很不好的情况。要及时备份,保证稳定性。

例如之前的代码,如果没有写时复制,那么每个子进程的i都是不变的。


waitpid

进程回收函数。

pid_t pid = waitpid(pid_t pid, int* status, int opt)

回收僵尸进程,支持非阻塞回收方案。

pid参数:

  1. 小于-1:指的是组,加负号就是组id,回收特定组里的id。跨组。
  2. 等于-1:回收任意子进程。任意。
  3. 等于0:同组回收,回收调用的进程。同组。
  4. 大于0:特定。

opt参数:opt=WNOHANG(非阻塞)

返回值:

  1. 大于0:成功了,返回的是僵尸进程的pid。
  2. 等于0:非阻塞,子进程无需回收。
  3. 等于-1:回收失败。

非阻塞,可以干点别的,可以让父进程交替工作。

阻塞,就得一直等着。

非阻塞的waitpid函数,使得更加灵活。

非阻塞轮询回收。

int main(void){
	pid_t pid;
	pid_t zpid;
	int i=0;
	for(i;i<5;++i){
		pid=fork();
		if(!pid)break;
	}
	if(pid>0){
		printf("im father, and my pid is %d\n",getpid());
		while((zpid=waitpid(-1,NULL,WNOHANG))!=-1){
			if(zpid>0){
				printf("parent wait zombie success...\n");
			}else{
				printf("parent running...\n");
				sleep(1);
			}
		}
	}else if(!pid){
		printf("im child NO %d, and my pid is %d\n",i,getpid());
		sleep(i);
		exit(i);
	}else{
		perror("fork call failed\n");
		exit(1);
	}
	return 0;
}

其中,在父进程当中,必须把zpid赋值的过程写进循环里。

因为每次都要进行一个赋值,然后判断,否则就死循环了。

输出结果:

LinuxDemo01

关于进程校验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值