【发布时间】:2019-11-18 17:21:02
【问题描述】:
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 开头)在 Linux 上运行。进一步假设有一些共享内存,父母和孩子都可以修改。
在父进程的上下文中,我想停止子进程并知道它实际上已经停止,而且子进程所做的任何共享内存写入对父进程都是可见的(包括任何同步或缓存刷新这可能需要在多处理器系统中)。
This answer,它谈到使用 kill(SIGSTOP) 停止子进程,包含一个有趣的花絮:
当第一次 kill() 调用成功时,您可以放心地假定子进程已停止。
这句话真的是真的吗?如果是的话,谁能解释一下,或者指点我一些更详细的文档(例如 Linux 联机帮助页)?否则,我是否可以使用另一种机制来确保子进程完全停止并且不会再对共享内存进行任何写入?
我正在想象以下内容:
- 父级发送不同的信号(例如 SIGUSR1),子级可以处理该信号
- 孩子处理 SIGUSR1 并在信号处理程序中执行类似 pthread_cond_wait() 的操作以安全地“停止”(尽管从内核角度来看仍在运行)——这在我的脑海中还没有完全充实,只是一个想法
如果这个问题已经有了既定的解决方案,我想避免重新发明轮子。注意子进程需要被抢先停止;在这种情况下,向子进程添加某种主动轮询不是一种选择。
如果它只存在于 Linux 上,pthread_suspend() 将是完美的......
【问题讨论】:
-
子进程在信号处理程序中执行一些互斥/cond 魔术,让父进程知道它已停止 停止的进程无法执行任何操作 - 根据定义。
-
"父进程发送一个不同的信号(例如 SIGUSR1)" 所以从内核的角度来看,子进程不会真正停止,只是在等待,例如pthread_cond_wait() -- 我将编辑问题以澄清
标签: linux unix signals child-process