- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有很多 fork 的过程。子进程做很多事情和另一个系统调用。
当任何子进程从系统调用中获取错误时,它会将错误描述打印到 stderr 并将 SIGUSR1 发送到组长(主要父进程)。
SIGUSR1 告诉父进程杀死所有子进程,释放资源并退出程序执行(以避免僵尸进程)。
我需要一次杀死所有的 child 。原子地。因此,当任何子进程发生任何错误时,所有子进程都会立即停止工作。
当前父进程使用 SIGUSR2 杀死所有子进程 - 它向所有进程组成员发送此信号 (killpg
) - 他们都安装了信号处理程序来杀死它们(退出) - 组长不会得到虽然被杀死了(它仍然需要释放资源)。
问题是在所有子进程被杀死之前,它们仍然可以执行大约 1-2 行代码,这不是我想要的。我需要立即阻止他们。
我怎样才能做到这一点?
最佳答案
信号以异步方式传递,因为父进程和子进程都在运行,您不能期望子进程会在父进程发送信号时立即处理信号。
The problem is that before all child processes get killed, they still can execute about 1-2 rows of code, which is not what I want. I need to stop them immediately.
您的问题更多是进程之间的协调和同步,而不是信号句柄。我能想到的有两种方法:
使用同步信号。也就是说,当每个 child 向 parent 发送 SIGUSR1
时,他们停止工作,并通过等待函数等待 SIGUSR2
信号,如 sigtimedwait
,或者sigwait
,这样,他们在退出前不会运行任何额外的代码。
使用pipe
或socketpair
创建parent与child之间的通信 channel ,即parent向child发送kill指令,每个child释放必要的资源并自杀。这就需要 child 边做作业边听 channel 。
关于C - 原子 killpg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705762/
我有很多 fork 的过程。子进程做很多事情和另一个系统调用。 当任何子进程从系统调用中获取错误时,它会将错误描述打印到 stderr 并将 SIGUSR1 发送到组长(主要父进程)。 SIGUSR1
我正在编写代码来终止进程和所有子进程。 根据 this post ,可以使用 os.killpg(pro.pid, signal.SIGTERM) 杀死同一进程组中的所有子进程 在测试期间,我手动启动
我有一些代码可以fork(),在子进程中调用setsid(),并开始一些处理。如果任何子进程退出 (waitpid(-1, 0)),我将杀死所有子进程组: child_pids = [] for ch
我有一个调用多个进程的 python 脚本,这些进程可以调用更多进程。为了杀死所有这些,我使用了以下脚本: os.setpgrp() # Code which invokes multiple pro
我是一名优秀的程序员,十分优秀!