waitpid和ptrace如何协同工作?

时间:2017-08-20 15:11:14

标签: linux-kernel

通过Linux 4.12的源代码,当任务 ptraced 时,我无法绕过下面的代码。

do_wait()

将致电

ptrace_do_wait(wo, tsk)

将调用

wait_consider_task

对于它正在跟踪的每个线程。这将依次调用

wait_task_stopped

然后会找到PID [pid = task_pid_vnr(p);] waitpid 会返回,这很棒。

然后它调用

put_task_struct(p);

将释放任务结构。如果发生这种情况,那么调试器如何再次等待此进程/任务?这个条目是否会在某个地方再次添加,如果是这样的话?

任何人都可以向我解释这个流程吗?感谢。

1 个答案:

答案 0 :(得分:0)

你是什么意思" put_task_struct释放结构"?你熟悉引用计数吗?你看到匹配的get_task_struct了吗?

让我们看一下代码:

get_task_struct(p);

refcount递增

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);

...并且refcount递减。如果这是最后一个引用,则释放该对象。否则没有任何反应。