在C中制作一个主管流程

时间:2012-07-14 11:53:40

标签: c supervisor

我想在c中创建一个监督程序,控制其他一些进程的启动,密切关注所有进程(以前由它自己启动)并处理任何错误,如果任何进程终止管理所有进程/ O该进程的错误,并使用相同的上下文和终止点重新启动该进程。也可以尝试解决终止背后的错误 我搜索了很多,但没有发现任何好事。我发现Erlang中有主管控制。我想在C中做同样的事情。 我想到了两种方法(关注流程的终止):

  1. 使用信号:此外还有两种方法:

      

    a)使用主管的轮询协议,并定期检查过程是否正常   b)处理非监督程序中的所有信号,并通知主管是否有任何杀手信号出现。

  2. 使用进程记帐:正如Stevens - (pg250)中定义的那样,只要进程终止记录,就会在记帐文件中写入。我可以让主管这个会计文件驱动。无论何时发生任何更改,它都会检查我们的某个进程是否已终止并处理它。

  3. 我想要的是有关此主管流程的任何信息,因为关于它的网络很少。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你可以做几件事。

管理儿童

<强>信号

优点:

  • 简单,自动异步
  • 内置于每个POSIX系统
  • 内置于C
  • 如果孩子遵守信号操作的惯例,则允许对孩子进行少量控制(SIGHUP:重新加载配置,SIGTERM:受控关闭,SIGINT:终止/忽略, SIGKILL:终止(没有选择),等等。)

缺点:

  • 不准确的
  • 信号只能传达非常基本的想法而没有额外的数据
  • 信号传递无法保证
  • 信号可以很容易地延迟,唯一可以依靠高负荷交付的信号是SIGKILL
  • 只有两个用户定义的操作信号:SIGUSR1SIGUSR2

<强>会计

优点:

  • 与信号相同,因为通过接收SIGCHLD
  • 的父母来获取关于死孩子的通知

缺点:

  • 与信号相同
  • 很少控制。您可以知道孩子何时终止,并且您可以重新启动它。没有额外的数据,除非你结合使用信号,甚至 less 控制。

IPC(和UNIX域套接字)

优点:

  • 可靠
  • 富。您可以根据需要通过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杀死。< / p>


以下是您应该研究的几件事:

  • setrlimit的{​​{3}}
  • 关于Linux编程的伟大的 man page。看一下关于IPC的章节。
  • 维基百科上的
  • free ebook
  • 维基百科上的OSX / BSD init

总而言之,我必须建议您使用IPC。如果您无法修改要监督的代码,您仍然可以执行某些操作。如果你可以获得状态,甚至更好,从它的STDOUT和STDIN控制一个进程,看看C stdlib的launchd以及它构建的是什么,POSIX的popen

答案 1 :(得分:0)

使用Stevens在UNIX®环境中的高级编程,您应该得到解决。

如果您想要一些类似程序的示例,请查看Linux sysvinit以及Apple的launchd等其他变体或init的BSD变体。另一个例子是互联网超级服务器inet.d。 (Source from Applexinit.d