加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_镇江站长网 (https://www.0511zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux进程管理之wait系统调用

发布时间:2016-02-07 21:19:44 所属栏目:Linux 来源:网络整理
导读:六: wait4 ()系统调用 在父进程中,用wait4()可以获得子进程的退出状态,并且防止在父进程退出前,子进程退出造成僵死 状态。这是我们这节分析的最后一个小节了

1:申请一个等待队列:

DECLARE_WAITQUEUE():
//name:等待队列的名字。Tsk:所要操作的task
#define DECLARE_WAITQUEUE(name, tsk)                    
     wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)
#define __WAITQUEUE_INITIALIZER(name, tsk) {                 
     .private = tsk,                           
     .func         = default_wake_function,             
     .task_list    = { NULL, NULL } }

default_wake_function()为默认的唤醒处理函数。

2:添加等待队列。

在上面的代码中,有:

add_wait_queue(&current->signal->wait_chldexit,&wait);

它的意思是将wait添加至&current->signal->wait_chldexit中。代码如下:

void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
{
   unsigned long flags;
   wait->flags &= ~WQ_FLAG_EXCLUSIVE;
   //为了防止竞争。加锁
   spin_lock_irqsave(&q->lock, flags);
   //添加至队列
   __add_wait_queue(q, wait);
   //解锁
   spin_unlock_irqrestore(&q->lock, flags);
}

3:唤醒操作:

在do_notify_parent()中有这样的代码片段:

……
__wake_up_parent(tsk, tsk->parent);
……
__wake_up_parent()的代码如下:
static inline void __wake_up_parent(struct task_struct *p,
            struct task_struct *parent)
{
   wake_up_interruptible_sync(&parent->signal->wait_chldexit);
}

(编辑:应用网_镇江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!