我想在c中创建一个监督程序,控制其他一些进程的启动,密切关注所有进程(以前由它自己启动)并处理任何错误,如果任何进程终止管理所有进程/ O该进程的错误,并使用相同的上下文和终止点重新启动该进程。也可以尝试解决终止背后的错误 我搜索了很多,但没有发现任何好事。我发现Erlang中有主管控制。我想在C中做同样的事情。 我想到了两种方法(关注流程的终止):
使用信号:此外还有两种方法:
a)使用主管的轮询协议,并定期检查过程是否正常 b)处理非监督程序中的所有信号,并通知主管是否有任何杀手信号出现。
使用进程记帐:正如Stevens - (pg250)中定义的那样,只要进程终止记录,就会在记帐文件中写入。我可以让主管这个会计文件驱动。无论何时发生任何更改,它都会检查我们的某个进程是否已终止并处理它。
我想要的是有关此主管流程的任何信息,因为关于它的网络很少。
答案 0 :(得分:1)
如果我理解正确,你可以做几件事。
<强>信号强>
优点:
SIGHUP
:重新加载配置,SIGTERM
:受控关闭,SIGINT
:终止/忽略, SIGKILL
:终止(没有选择),等等。)缺点:
SIGKILL
SIGUSR1
和SIGUSR2
<强>会计强>
优点:
SIGCHLD
缺点:
IPC(和UNIX域套接字)
优点:
缺点:
这只是一个注释。如果您使用的是标准fork
(或vfork
)/ exec
,则还可以限制子资源的使用情况。所以这是psudocode:
if(fork() != 0)
{
setrlimit(...); //Set the resource limits of the child. Look at `man 2 setrlimit`
exec..(...);
}
setrlimit
让你设置进程可以拥有的挂钟CPU数量,内存量,文件数等等的限制。如果进程超过,它将被SIGXCPU
杀死。< / p>
以下是您应该研究的几件事:
setrlimit
的{{3}} init
总而言之,我必须建议您使用IPC。如果您无法修改要监督的代码,您仍然可以执行某些操作。如果你可以获得状态,甚至更好,从它的STDOUT和STDIN控制一个进程,看看C stdlib的launchd
以及它构建的是什么,POSIX的popen
。
答案 1 :(得分:0)
使用Stevens在UNIX®环境中的高级编程,您应该得到解决。
如果您想要一些类似程序的示例,请查看Linux sysvinit以及Apple的launchd等其他变体或init的BSD变体。另一个例子是互联网超级服务器inet.d。 (Source from Apple或xinit.d)