linux停止进程循环,linux进程终止与进程等待

1.vfork函数

vfork与fork函数类似,但是vfork创建的子进程与父进程共用同一个虚拟地址空间。这样就有可能导致调用栈混乱,因此已经被弃用了。

2.进程终止

1.含义:进程终止的含义就是一个进程的退出。

2.场景

正常退出:程序跑完了所有代码,但结果可能正确也可能不正确。

非正常退出:程序没有跑完所有代码,在中途崩溃掉了。

3.退出的方法:

1.main函数的return退出。

2.exit,库函数,退出码:函数在退出的时候,返回的值,来源于main函数的返回值,或者exit参数,可以使用echo $?查看。

3._exit

exit与_exit的区别:

exit是库函数,而_exit是系统调用。exit在退出时会先调用用户自定义清理函数,即atexit函数,这个函数是一个回调函数,将参数传入的函数地址告诉内核,当程序需要退出的时候,才调用传入的函数。然后冲刷缓冲区关闭流等。

哪些代码会冲刷缓冲区?

1.从main函数的return返回会刷新缓冲区

2./n也会刷新缓冲区。

3.调用exit也会刷新缓冲区。

4.fflush可以强制刷新缓冲区。

原因:因为缓冲区是C库进行维护的,而不是内核。如果调用了_exit,直接执行内核代码,不会刷新缓冲区。如果调用exit,在结束之前,会先将缓冲区的的数据进行刷新。

3.进程等待

1.为什么要进程等待?

进程等待就是为了防止僵尸进程的产生,回收子进程的资源。

2.进程等待的方法

wait:原型是pid_t wait(int*status),status是一个出参,供调用wait的进程获取子进程的退出信息的。此函数会在这个形参指针中写入数据,来获取子进程退出信息。那么具体是如何做的呢?

正常退出时:wait函数在这个int型空间的前两个高权值字节中写入退出码,在后两个低权值字节中写入0。

异常退出时:wait函数在前两个高权值字节中写入退出码,在退出码字节的后面紧跟着写入coredump标志位,在剩下的位中写入终止信号。

如何利用status值获取退出信息?

1.判断程序是否正常退出:将status&0X7f,如果为0,则是正常退出,如果>0,则是异常退出。

2.判断是否有coredump产生,(status>>7)&0X1,如果为0则无coredump产生,如果为1则有coredump产生。

3.获取退出码:(status>>8)&0XFF。

阻塞与非阻塞

阻塞:调用wait函数时函数会处于阻塞状态,会一直等待函数需要满足的条件才会返回,如果函数条件需要的条件一直没有满足,则一直等待。

非阻塞:当调用函数需要等待一定条件成熟的时候,成熟则返回。条件不成熟也返回。

waitpid:

原型pid_t waitpid(pid_t pid,int* status,int options),

pid:要等待子进程的进程号。

status:子进程退出信息。

options:设置waitpid是阻塞的还是非阻塞的。非阻塞需要搭配循环去使用,在调用waitpid时,没有等待到子进程退出,则循环去调用waitpid接口。如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值