C 启动守护进程作为外部程序?
C Starting daemon as external programm?
我有一个 C Linux 程序,它使用 fork()
到 运行 作为守护进程并且(一旦守护进程 运行 正常)结束自己。
现在我想对外部程序做同样的事情。
这应该是工作流程:
- 启动启动程序
- 启动内部守护进程
- 启动外部程序,它本身将使用
fork()
和 运行 作为守护进程
- 退出启动程序
内部守护进程应该能够监控外部守护进程并检查它是否启动,如果可能的话 运行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 ,对吧?
在这两种情况下,我都无法真正监控另一个守护进程,对吗?
再次感谢!
我有一个 C Linux 程序,它使用 fork()
到 运行 作为守护进程并且(一旦守护进程 运行 正常)结束自己。
现在我想对外部程序做同样的事情。
这应该是工作流程:
- 启动启动程序
- 启动内部守护进程
- 启动外部程序,它本身将使用
fork()
和 运行 作为守护进程 - 退出启动程序
内部守护进程应该能够监控外部守护进程并检查它是否启动,如果可能的话 运行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 ,对吧? 在这两种情况下,我都无法真正监控另一个守护进程,对吗?
再次感谢!