2017-08-20 20 views
0

Linux 4.12のソースコードを参照すると、タスクがの場合、の場合、以下のコードで頭を囲むことができません。waitpidとptraceはどのように連携しますか?

do_wait() 

は、それがトレースされていることをすべてのスレッドの

wait_consider_task 

を呼び出します

ptrace_do_wait(wo, tsk) 

を呼び出します。その後、が返されますをwaitpidのものですPID [pid = task_pid_vnr(p);]を見つけるターンコール

wait_task_stopped 

のこの意志は、これは素晴らしいです。

しかし、それは、タスク構造体を解放します

put_task_struct(p); 

を呼び出します。その場合、デバッガはこのプロセス/タスクを再びどのように待機しますか?このエントリーはどこかにもう一度追加されますか?

誰にでもこの流れを私に説明できますか?ありがとう。

答えて

0

"put_task_structは構造を解放します"ということはどういう意味ですか?あなたは参照カウントに精通していますか?一致するget_task_structが見えましたか?

のコードを見てみましょう:

get_task_struct(p); 

参照カウントが

pid = task_pid_vnr(p); 
why = ptrace ? CLD_TRAPPED : CLD_STOPPED; 
read_unlock(&tasklist_lock); 

をインクリメントすべてのタスクのリストのロックが解除されます。原則として、誰かにスレッド上での増加により参照カウント

sched_annotate_sleep(); 
if (wo->wo_rusage) 
     getrusage(p, RUSAGE_BOTH, wo->wo_rusage); 
put_task_struct(p); 

の構造そのものではなく、すべてのものを取り除く...と参照カウントがデクリメントされ)(待つことができます。これが最後のrefだった場合、オブジェクトは解放されます。そうでなければ何も起こらない。