1

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

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

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

  2. 使用进程记帐:正如Stevens 中所定义的 - (pg250)每当一个进程终止时,一条记录将被写入记帐文件中。我可以让主管这个会计文件驱动。每当发生任何更改时,它都会检查我们的某个进程是否已终止并进行处理。

我想要的是有关此主管流程的任何信息,因为网上对此知之甚少。

4

2 回答 2

1

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

管理孩子

信号

优点:

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

缺点:

  • 不准确
  • 信号只能传达非常基本的想法,没有额外的数据
  • 不保证信号传递
  • 信号很容易延迟,而在高负载下您真正可以依赖的唯一信号是SIGKILL
  • 只有两个用户定义的动作信号:SIGUSR1SIGUSR2

会计

优点:

  • 与信号相同,因为收到有关死亡孩子的通知是通过父母接收完成的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.

于 2012-07-14T15:17:10.793 回答
0

通过 Stevens的 UNIX® 环境中的高级编程,您应该会安定下来。

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

于 2012-07-14T12:51:33.103 回答