C 启动守护进程作为外部程序?

C Starting daemon as external programm?

我有一个 C Linux 程序,它使用 fork() 到 运行 作为守护进程并且(一旦守护进程 运行 正常)结束自己。

现在我想对外部程序做同样的事情。

这应该是工作流程:

  1. 启动启动程序
  2. 启动内部守护进程
  3. 启动外部程序,它本身将使用 fork() 和 运行 作为守护进程
  4. 退出启动程序

内部守护进程应该能够监控外部守护进程并检查它是否启动,如果可能的话 运行ning。这两者之间不应出现直接通信(它们将通过 MQTT 通信)。

第 1 部分和第 2 部分到目前为止还不错。现在我读到 exec() 来启动外部程序,但在这种情况下,调用者永远不会 return 等待被调用程序退出。

我对以下 3. 的看法是否正确? 执行 exec() 并启动程序。该程序本身将在后台执行 fork() 和 运行,父进程将退出,因此启动程序也将退出。但是被调用程序的退出不是被视为exec()的错误吗?

非常感谢!

/KNEBB

我看到了两种可能的方法。

第一种方法:

1. Start launcher
     |
2. fork() --(child)--> Internal daemon process.
     |(parent)
3. exec()
   External program (replacing launcher)
     |
   fork() --(child)--> External daemon process.
     |(parent)
4. exit()

第二种方法:

1. Start launcher
     |
2. fork() --(child)--> Internal daemon process.
     |(parent)
3. fork() ---------->(child)
     |(parent)         |
     |               exec()
     |               External main (background) process
4. exit()

这两种方法的区别在于第二次分叉发生的位置。在第一种方法中,启动器和外部程序都 fork 子进程并且它们的父进程退出。在第二种方法中,启动器分叉两个子进程,而外部程序不分叉。在这两种方法中,两个子守护进程被抛在后面并且它们的父进程已经退出,所以它们都得到 re-parented 到 init 进程(PID 1)。

1. Start launcher
     |
2. fork() ------  (child)
     |(launcher)    |
3.  exit()        fork() -->internal daemon
                    |(child) 
4.                exec() ---> external program
                                  |
                               fork() ----------- external daemon 
                                  |
                               exit()

嗯,仔细想想我觉得你的建议比较好。在这两种情况下,守护进程都会得到 re-parented ,对吧? 在这两种情况下,我都无法真正监控另一个守护进程,对吗?

再次感谢!