【进程管理】系统调用wait4()

一个进程(线程)执行了exit()后,它只是由于state设置成了TASK_ZOMBIE后,永远得不到调用,它的task_struct和系统堆栈空间还是有的;到父进程收到子进程发来的信号而来处理后事,将子进程的task_struct结构释放,子进程就从系统中消失了;


(1)wait4()的内核入口是sys_wait4(),首先,在当前进程的系统空间堆栈中通过DECLARE_WAITQUEUE分配空间,并建立了一个wait_queue_t数据结构,一旦从sys_wait4()返回后,这个数据结构就不存在了;通过add_wait_queue()将这个数据结构加入到当前进程的wait_chldexit队列中;这个goto语句循环要到当前进程被调度运行,并且下列条件之一得到满足时才结束,所等待的子进程状态变为TASK_STOPPED或 TASK_ZOMBIE,所等待的子进程存在,可不在上述两个状态,而options中的WNOHANG标志位为1,或者当前进程收到了其他信号;进程号为pid的那个进程根本不存在,或者不是当前进程的子进程;否则就将当前进程的自身状态设置成TASK_INTERRUPTIBLE,并调用接受schedule()返回时,就再次repeat了,再次通过一个for循环扫描其子进程队列,再看看等待的子进程的状态是否满足条件;当子进程exit()时,就会向父进程发 一个信号,从而将其唤醒,就是在exit_notify()通过do_notify_parent(),调用send_sig_info()将其发送给父进程,并调用wake_up_process()(把父进程的状态从TASK_INTERRUPTANLE改成TASK_RUNNING,将它转移到可执行队列中)将父进程唤醒,接受调度;

(2)此时子进程的状态已经改成了TASK_ZOMBIE了,所以父进程在将子进程在用户空间运行的时间和系统空间运行的时间合并入到自身的统计数据,然后使用release_task()将子进程残留的资源(task_struct和系统空间堆栈)全部释放掉,先是将子进程的task_struct结构从杂凑队列中移除,然后把子进程其他的几项统计信息合并到父进程,然后调用free_task_struct()将task_struct结构和系统空间堆栈占据的两个物理页面释放掉;把可能的一些状态信息和统计信息通过put_user()复制到用户空间中,如果复制失败的话,那就要不能将子进程的task_struct释放掉;但是会在父进程自身要死亡时,它会有托孤行动;

(3)假设父进程不在wait4()中等待,那也不要惊,每当系统从系统调用,中断或异常返回时,就要检查一下是否有信号等待处理,如果有的话就转入了entry.S中的signal处调用do_signal(),参数pid为-1,表示同一个进程组中的任何一个子进程都在处理之列(时钟中断保证一定会有do_signal()发生);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值