深入理解linux 47頁裡面介紹父程序通過wait4/waitpid等方法監控子程序的退出狀態,子程序進入僵死狀態時,父程序通過waitx就會促使父程序釋放子程序的資源,促使子程序從僵死狀態進入終止狀態。
我們通過2.6.23版本核心**分析該場景。
long do_wait(pid_t pid, int options, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru)
declare_waitqueue(wait, current);
struct task_struct *tsk;
add_wait_queue(¤t->signal->wait_chldexit,&wait);//子程序exit可以喚醒父程序
repeat:
/*如果父程序沒有收到子程序的結束訊號,則將在schedule函式執行後睡眠。直到子程序發出結束訊號,喚醒父程序。*/
current->state = task_interruptible;
tsk = current;//父程序被喚醒
dostruct task_struct *p;
struct list_head *_p;
list_for_each(_p,&tsk->children)//遍歷子程序,根據子程序當前狀態決定下一步動作
p = list_entry(_p, struct task_struct, sibling);
switch (p->state)
case task_traced:
... ...
case task_stopped:
... ...
default:
if (p->exit_state == exit_dead)
continue;
if (p->exit_state == exit_zombie)
retval = wait_task_zombie(p, (options & wnowait), infop, stat_addr, ru);
=>int wait_task_zombie(struct task_struct *p, int noreap, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru)
state = xchg(&p->exit_state, exit_dead);
if (p != null)
release_task(p);
/*釋放子程序描述符*/
=>void release_task(struct task_struct * p)
call_rcu(&p->rcu, delayed_put_task_struct);
return retval;
break;
tsk = next_thread(tsk);
while (tsk != current);
end:
current->state = task_running;//父程序恢復就緒態
remove_wait_queue(¤t->signal->wait_chldexit,&wait);//子程序訊號已經沒用了
return retval;
卷積的意義
卷積 最近總是和卷積打交道,工作需要,每天都要碰到它好幾次,不勝煩惱,因為在大學時候學訊號與系統的時候就沒學會,我於是心想一定要把卷積完全搞明白。正好同辦公室的同學也問我什麼是卷積,師姐昨天也告訴我說 我也早就想把這個問題搞明白了!經過一段時間的思考之後,有一些很有趣的體會和大家分享。聽說卷積這種表...
補碼的意義
數值有正負之分,計算機就用乙個數的最高位存放符號 0為正,1為負 這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運...
卷積的意義
卷積 最近總是和卷積打交道,工作需要,每天都要碰到它好幾次,不勝煩惱,因為在大學時候學訊號與系統的時候就沒學會,我於是心想一定要把卷積完全搞明白。正好同辦公室的同學也問我什麼是卷積,師姐昨天也告訴我說 我也早就想把這個問題搞明白了!經過一段時間的思考之後,有一些很有趣的體會和大家分享。聽說卷積這種表...