如何在 Stopped 状态下分叉 Linux 进程?
How to fork a Linux process in a Stopped state?
我正在使用 clone(2)
调用开始一项新任务。
曾经有CLONE_STOPPED
标志,但它不再存在于当前内核中。
是否有任何技巧可以在停止状态下启动任务(等待 SIGCONT
实际上 运行)?
child可以在执行fn
的开头发送自己SIGSTOP
你不能,在最近的内核中没有办法做到这一点,除非你编写一个内核模块来做到这一点。
您可以在 kernel/fork.c (L1449) 中看到内核 v2.6.32 过去是如何做到的:
if (unlikely(clone_flags & CLONE_STOPPED)) {
/*
* We'll start up with an immediate SIGSTOP.
*/
sigaddset(&p->pending.signal, SIGSTOP);
set_tsk_thread_flag(p, TIF_SIGPENDING);
__set_task_state(p, TASK_STOPPED);
} else {
wake_up_new_task(p, clone_flags);
}
应该可以(但可以说不是微不足道的?)在内核中编写一个包装函数 space 来做类似的事情。
我正在使用 clone(2)
调用开始一项新任务。
曾经有CLONE_STOPPED
标志,但它不再存在于当前内核中。
是否有任何技巧可以在停止状态下启动任务(等待 SIGCONT
实际上 运行)?
child可以在执行fn
SIGSTOP
你不能,在最近的内核中没有办法做到这一点,除非你编写一个内核模块来做到这一点。
您可以在 kernel/fork.c (L1449) 中看到内核 v2.6.32 过去是如何做到的:
if (unlikely(clone_flags & CLONE_STOPPED)) {
/*
* We'll start up with an immediate SIGSTOP.
*/
sigaddset(&p->pending.signal, SIGSTOP);
set_tsk_thread_flag(p, TIF_SIGPENDING);
__set_task_state(p, TASK_STOPPED);
} else {
wake_up_new_task(p, clone_flags);
}
应该可以(但可以说不是微不足道的?)在内核中编写一个包装函数 space 来做类似的事情。