Linux进程(二)进程创建,等待,终止

进程创建

fork函数初识
在Linux中fork函数是非常重要的函数,它从已存在的进程中创建一个新进程。新进程就是子进程,而原来的进程就是父进程。
当一个进程调用fork之后,就有两个二进制代码相同的进程。而且他们都运行到相同的地方,但每个进程都可以开始他们自己的旅程。

fork函数的返回值

子进程返回0;
父进程返回的是子进程的pid。

数据写时拷贝
通常,父子代码共享,父子再不写入时,他们的数据也是共享的,但是当一方试图写入,数据就会以写时拷贝的方式各自一份
他们执行的先后顺序是由调度器决定的
这里写图片描述

vfork
它和fork函数都是创建一个子进程,但是它跟fork不一样的是,vfork创建的子进程和父进程共享同样的地址空间,在vfork下进程的优先级也不一样,它需要保证子进程先执行,在子进程调用exit之后,父进程才会被执行

进程终止

进程退出有三个场景分别是
1:代码运行完毕,结果正确。
2:代码运行完毕,结果不正确。
3:代码异常终止
进程常见的退出方法
1,从main函数返回
2,调用exit
3,_exit
exit在最后也会调用_exit 但是在调用它之前,还做了其他工作:
1,执行用户定义的清理函数
2,关闭所有打开的流,所有缓存数据均被写入
3,调用_exit
这里写图片描述

进程等待

进程等待的必要性

*子进0程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而会造成内存泄漏。
*另外,进程进入僵尸状态就没法杀死
*所以,父进程派给子进程的任务完成的如何,我们需要知道。所以父进程通过等待的方式,回收子进程资源,获取子进程的退出信息

进程等待的方法

wait方法:
这里写图片描述
如何获取这个 status参数呢
这个参数叫做输出型参数,由操作系统填充。
如果传递NULL,表示不关心子进程的退出状态信息。
否则,操作系统会根据该擦书,将子进程的退出信息反馈给父进程。
status不能简单的当做整形来看待,可以当做位图来看待,具体细节如下图(只研究status低十六比特位):

这里写图片描述

waitpid函数可以让父进程等待指定的pid
用法:
pid_t waitpid(pid_t pid, int *status, int options);
waitpid(-1,int *status,int options); 如果为-1表示等待任意子进程
pid_t waitpid(pid_t pid, int *status, int options);
waitpid第三个参数:
0:返回wait的进程的pid
WNOHANG:如果子进程不存在就立即返回
当最后一个参数是0的时候就会发生阻塞式等待(在子程序没有执行完的时间内一直等待)
当最后一个参数是WHOHANG的时候,就会进行非阻塞式等待,如果检测子进程不存在就会立即返回,等过段时间再检测

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值