【问题标题】:How to fork a Linux process in a Stopped state?如何在停止状态下分叉 Linux 进程?
【发布时间】:2016-01-02 17:23:09
【问题描述】:

我正在使用clone(2) 调用开始一项新任务。

以前有CLONE_STOPPED 标志,但它不再存在于当前内核中。

有什么技巧可以在 Stopped 状态下启动任务(等待SIGCONT 实际运行)?

【问题讨论】:

  • 您这样做的目的是什么?如果这是出于调试目的,您可以将ptracePTRACE_O_TRACEFORK 一起使用
  • 因为我正在实现的 API 要求 spawn_thread() 在停止状态下生成线程,等待 resume_thread()。我没有设计它 - 我只是在实现它。

标签: linux fork clone system-calls


【解决方案1】:

你不能,在最近的内核中没有办法做到这一点,除非你编写一个内核模块来做到这一点。

您可以在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);
}

应该有可能(但可以说不是微不足道的?)在内核空间中编写一个包装函数来做类似的事情。

【讨论】:

  • 嗯...转发该代码也是我正在考虑的一种选择。感谢您为我钉钉子。 :)
【解决方案2】:

孩子可以在执行fn的开头发送自己SIGSTOP

【讨论】:

  • 这是我到目前为止所做的,但这并不是问题所在。 :-) 如果它最初只是为了停止自身而运行,则其他进程竞相停止/继续它存在问题。
  • 另外,事实证明 SIGSTOP 是一个进程级处理的信号,所以虽然可以 SIGCONT 一个任务,但 SIGSTOP 会停止整个任务组。
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
相关资源
最近更新 更多