用C语言制作一个监控程序

用C语言制作一个监控程序,c,C,我想在c中创建一个监控进程,它控制其他进程的启动,监视所有进程(以前是自己启动的),并处理任何错误,比如任何进程终止,管理该进程的所有I/O错误,并使用相同的上下文和从终止点重新启动该进程。也可以尝试解决终止后的错误。 我找了很多,但没找到什么好东西。我发现Erlang中存在主管控制。我想在C中也这样做。 我想到了两种方法(注意流程的终止): 使用信号:还有两种方法: a) 使用来自主管的轮询协议,并定期检查流程是否正常。 b) 处理非主管流程中的所有信号,并在出现杀手信号时通知主管 使用流程

我想在c中创建一个监控进程,它控制其他进程的启动,监视所有进程(以前是自己启动的),并处理任何错误,比如任何进程终止,管理该进程的所有I/O错误,并使用相同的上下文和从终止点重新启动该进程。也可以尝试解决终止后的错误。
我找了很多,但没找到什么好东西。我发现Erlang中存在主管控制。我想在C中也这样做。 我想到了两种方法(注意流程的终止):

  • 使用信号:还有两种方法:

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

  • 使用流程记帐:如中所定义,每当流程终止时,将在记帐文件中写入记录。我可以让主管管理这个会计文件。无论何时发生任何更改,它都会检查是否有一个进程被终止并进行处理

  • 我想要的是有关此主管流程的任何信息,因为网络上几乎没有关于它的信息。

    使用Stevens在UNIX®环境中的高级编程,您应该可以解决这个问题

    如果你想要一些类似程序的例子,可以看看Linux,或者其他的变体,比如苹果的或者init的BSD变体。另一个例子是inet.d,internet超级服务器。(或)

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


    如果你想要一些类似程序的例子,可以看看Linux,或者其他的变体,比如苹果的或者init的BSD变体。另一个例子是inet.d,internet超级服务器。(或者)

    如果我没弄错的话,你可以做几件事

    管理儿童 信号

    优点:

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

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

    优点:

    • 与信号相同,因为通过接收
      SIGCHLD
    缺点:

    • 与信号相同
    • 很难控制。您可以知道子进程何时终止,并可以重新启动它。没有额外的数据,除非您将信号结合使用,否则控制力甚至更低
    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
    杀死


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

    • setrlimit
      's
    • 关于Linux编程的一个很好的例子。看一看关于IPC的章节
    • 关于维基百科
    • 维基百科上的OSX/BSD

    总而言之,我不得不建议你使用IPC。如果你不能修改你想要监督的代码,你仍然可以做一些事情。如果您可以获得状态,或者更好地从STDOUT和STDIN控制进程,请查看C stdlib以及它的基础,POSIX。

    如果我理解正确,您可以做一些事情

    管理儿童 信号

    优点:

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

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

    优点:

    • 与信号相同,因为通过接收
      SIGCHLD
    缺点: