微視linux waitX的意義

2021-09-22 10:26:38 字數 1680 閱讀 7589

深入理解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個.有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運...

卷積的意義

卷積 最近總是和卷積打交道,工作需要,每天都要碰到它好幾次,不勝煩惱,因為在大學時候學訊號與系統的時候就沒學會,我於是心想一定要把卷積完全搞明白。正好同辦公室的同學也問我什麼是卷積,師姐昨天也告訴我說 我也早就想把這個問題搞明白了!經過一段時間的思考之後,有一些很有趣的體會和大家分享。聽說卷積這種表...