gpt4 book ai didi

c++ - 启动和监视另一个进程的 Linux 最佳实践

转载 作者:IT王子 更新时间:2023-10-29 01:25:47 28 4
gpt4 key购买 nike

在我的进程中,我需要启动/重新启动另一个进程。目前我使用一个堆栈大小很小的线程和以下代码:

void startAndMonitorA()
{
while(true)
{
system("myProcess");
LOG("myProcess crashed");
usleep(1000 * 1000);
}
}

我觉得这不是最佳做法。我不知道 std::system() 调用阻塞或浪费了哪些资源。我使用的是嵌入式 Linux - 所以一般来说,我会尽量关注资源。

最佳答案

一个有问题的部分是立即重启:如果子进程无法启动,将导致 CPU 使用率达到 100%。它可能是子进程中的暂时性错误(例如,无法连接到服务器)。在尝试重新启动之前添加至少一秒钟的暂停可能是个好主意。


system 调用在 Linux 上的作用是:

  1. 设置要忽略的信号 SIGINTSIGQUIT
  2. 阻止信号 SIGCHLD
  3. fork()
  4. 子进程调用 exec() shell,将命令行传递给 shell。
  5. 父进程调用 waitpid() 阻塞线程直到子进程终止。
  6. 父进程恢复其信号配置。

如果您要重新实现 system 的功能,您可能会省略第 5 步(以及第 1、2 和 6 步)以避免阻塞线程并依赖于 SIGCHLD 在子进程终止并需要重新启动时得到通知。

换句话说,最低限度是为 SIGCHLD 设置一个信号处理程序并调用 forkexec

关于c++ - 启动和监视另一个进程的 Linux 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485604/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com