用C语言制作一个监控程序
我想在c中创建一个监控进程,它控制其他进程的启动,监视所有进程(以前是自己启动的),并处理任何错误,比如任何进程终止,管理该进程的所有I/O错误,并使用相同的上下文和从终止点重新启动该进程。也可以尝试解决终止后的错误。用C语言制作一个监控程序,c,C,我想在c中创建一个监控进程,它控制其他进程的启动,监视所有进程(以前是自己启动的),并处理任何错误,比如任何进程终止,管理该进程的所有I/O错误,并使用相同的上下文和从终止点重新启动该进程。也可以尝试解决终止后的错误。 我找了很多,但没找到什么好东西。我发现Erlang中存在主管控制。我想在C中也这样做。 我想到了两种方法(注意流程的终止): 使用信号:还有两种方法: a) 使用来自主管的轮询协议,并定期检查流程是否正常。 b) 处理非主管流程中的所有信号,并在出现杀手信号时通知主管 使用流程
我找了很多,但没找到什么好东西。我发现Erlang中存在主管控制。我想在C中也这样做。 我想到了两种方法(注意流程的终止):
b) 处理非主管流程中的所有信号,并在出现杀手信号时通知主管
如果你想要一些类似程序的例子,可以看看Linux,或者其他的变体,比如苹果的或者init的BSD变体。另一个例子是inet.d,internet超级服务器。(或者)如果我没弄错的话,你可以做几件事 管理儿童 信号 优点:
- 简单、自动异步
- 内置于每个POSIX系统中
- 内置于C
- 如果孩子遵循信号操作的约定,允许对孩子进行少量控制(
:重新加载配置,SIGHUP
:受控关机,SIGTERM
:终止/忽略,SIGINT
:终止(无此选项),等等)SIGKILL
- 不准确
- 信号只能传达非常基本的想法,没有额外的数据
- 信号传递不受保障
- 信号可以很容易地延迟,而在高负载下,您唯一可以真正依赖的是
SIGKILL
- 只有两个用户定义的动作信号:
和SIGUSR1
SIGUSR2
- 与信号相同,因为通过接收
SIGCHLD
- 与信号相同
- 很难控制。您可以知道子进程何时终止,并可以重新启动它。没有额外的数据,除非您将信号结合使用,否则控制力甚至更低李>
- 可靠的
- 富有的。您可以通过IPC定义任意复杂的协议(甚至可能是完整的HTTP),也可以共享原始内存李>
- 有效的
- POSIX标准化
- 您定义了协议——发送消息以获取监管者需要知道的信息,并且仅此而已。你可以告诉主管你需要的任何事情李>
- 需要对监视的流程进行大量修改,这可能是不可能的
- 需要您发明自己的协议,这可能很困难李>
- 更多的代码
fork
(或vfork
)/exec
,还可以限制子资源的使用。这是psudocode:
if(fork() != 0)
{
setrlimit(...); //Set the resource limits of the child. Look at `man 2 setrlimit`
exec..(...);
}
setrlimit
让我们设置进程可以拥有多少挂钟CPU、多少内存、多少文件等的限制。如果进程超过此限制,它将被SIGXCPU
杀死
以下是您应该研究的几件事情:
'ssetrlimit
- 关于Linux编程的一个很好的例子。看一看关于IPC的章节
- 关于维基百科
- 维基百科上的OSX/BSD
总而言之,我不得不建议你使用IPC。如果你不能修改你想要监督的代码,你仍然可以做一些事情。如果您可以获得状态,或者更好地从STDOUT和STDIN控制进程,请查看C stdlib以及它的基础,POSIX。如果我理解正确,您可以做一些事情 管理儿童 信号 优点:
- 简单、自动异步
- 内置于每个POSIX系统中
- 内置于C
- 如果孩子遵循信号操作的约定,允许对孩子进行少量控制(
:重新加载配置,SIGHUP
:受控关机,SIGTERM
:终止/忽略,SIGINT
:终止(无此选项),等等)SIGKILL
- 不准确
- 信号只能传达非常基本的想法,没有额外的数据
- 信号传递不受保障
- 信号可以很容易地延迟,而在高负载下,您唯一可以真正依赖的是
SIGKILL
- 只有两个用户定义的动作信号:
和SIGUSR1
SIGUSR2
- 与信号相同,因为通过接收
SIGCHLD