完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
父进程用wait函数回收子进程 wait的工作原理: (1)子进程结束时,系统向其父进程发送SIGCHILD信号 (2)父进程调用wait函数之后就会阻塞在wait函数中,这个时候和scanf的阻塞是类似的 (3)父进程被SIGCHILD信号唤醒,就是父进程阻塞之后一直在等待这个信号,而我们的scanf函数的阻塞则是等待我们输入。唤醒之后父进程就会去回收子进程 (4)父子进程之间是异步的,也就是说子进程什么时候结束父进程是不知道的。两者就是通过SIGCHILD信号来解决之间异步通信的问题 (5)若父进程没有任何子进程的时候函数wait会返回错误 wait函数是一个系统调用。函数原型如下: pid_t wait(int *status); 注:没有const的表示这个参数是一个输出型参数 status返回的是子进程结束的一个状态。 pid_t则是返回结束的子进程的进程ID,当前进程有可能存在多个子进程,所以这个时候返回的就是结束的那一个(这里我们会发现一个问题,就是wait函数是没有办法指定回收那一个进程的,只能是有一个子进程结束了,发送一个SIGCHILD信号之后他就执行。比较死板,还不够灵活)。 几个宏定义的应用: WIFEXITED宏定义用来测试子进程是否是正常终止的。 使用方法:WIFEXITED(status) WIFSIGNALED 用来判断是否非正常终止,从字面上我们知道这个是被信号终止的 WEXITSTATUS 用来得到子进程正常终止的返回值,注意这里的返回值是无符号的整型,如果是负数的话会自动补齐。 wait和waitpid的区别: (1)两者的基本功能是一样的,回收子进程 (2)waitpid所拥有的一个新的功能就是能够回收指定的子进程 (3)waitpid可以使用阻塞或者非阻塞的方式回收子进程 waitpid 的函数原型: pid_t waitpid(pid_t pid, int *status ,int options); waitpid当中的参数pid如果传入的是-1的话那么就是回收任意一个结束的进程。options传入的就是选择阻塞式和非阻塞式的方式。 fork函数是用来创建子进程的,在这里温习一下,fork函数创建一次,返回两次,大于零的返回值既是子进程的进程ID同时我们还可以通过在if当中判断这个返回值进行子进程的程序编写,而返回值等于0的代表的就是我们的父进程,小于0的话就是说发生了错误。 竞态:全称就是竞争状态,多进程的环境下多个进程同时拖占系统资源,比如说两个进程需要同时使用一个IO,这个时候就会出现竞争的情况,这个竞争状态对于操作系统来说是有害的,会导致程序的结果的不稳定性。但是我们理想状态下是要保证程序运行结果就是我们想要的内容的。操作系统也提供了很多的方法给我们使用来避免竞争状态的产生,我们在写程序的时候就要考虑到这个方面的内容,用适当的方法解决竞争状状态。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4890 浏览 0 评论
87403 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4718 浏览 2 评论
3610 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2476 浏览 0 评论
1994浏览 3评论
1277浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1338浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1231浏览 0评论
1172浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 10:08 , Processed in 1.254861 second(s), Total 69, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号