如果我理解正确,您可以做几件事。
管理孩子
信号
优点:
- 简单,自动异步
- 内置于每个 POSIX 系统中
- 内置于 C
SIGHUP
如果孩子遵循信号操作的约定( :重新加载配置,SIGTERM
:受控关闭,SIGINT
:终止/忽略,SIGKILL
:终止(没有选项)等),则允许对孩子进行少量控制
缺点:
- 不准确
- 信号只能传达非常基本的想法,没有额外的数据
- 不保证信号传递
- 信号很容易延迟,而在高负载下您真正可以依赖的唯一信号是
SIGKILL
- 只有两个用户定义的动作信号:
SIGUSR1
和SIGUSR2
会计
优点:
- 与信号相同,因为收到有关死亡孩子的通知是通过父母接收完成的
SIGCHLD
缺点:
- 与信号相同
- 很少控制。您可以知道孩子何时终止,并且可以重新启动它。没有额外的数据,除非你结合使用信号,否则控制更少。
IPC(和 UNIX 域套接字)
优点:
- 可靠的
- 富有的。您可以通过 IPC(甚至是完整的 HTTP)定义任意复杂的协议,也可以只共享原始内存。
- 高效的
- POSIX 标准化
- 您定义协议——发送主管需要知道的消息,并且仅此而已。你可以告诉主管任何你需要的东西。
缺点:
- 需要对被监视的进程进行大量修改,这可能是不可能的。
- 要求您发明自己的协议,这可能很难。
- 更多代码。
限制儿童
这只是一个注释。如果您使用的是标准fork
(或vfork
)/ exec
,您还可以限制子资源的使用。所以这是伪代码:
if(fork() != 0)
{
setrlimit(...); //Set the resource limits of the child. Look at `man 2 setrlimit`
exec..(...);
}
setrlimit
让我们设置进程可以拥有多少时钟 CPU、多少内存、多少文件等的限制。如果进程超过,它会被SIGXCPU
.
以下是您应该研究的几件事:
总而言之,我不得不建议你使用IPC。而且如果你不能修改你想要监督的代码,你仍然可以做一些事情。如果您可以从 STDOUT 和 STDIN 获得状态,或者甚至更好地控制进程,请查看 C 标准库popen
及其构建的 POSIX 的pipe
.