我有一個 C Linux 程式,用于fork()作為守護程式運行,并且(一旦守護程式運行良好)自行結束。
現在我想對外部程式做同樣的事情。
這應該是作業流程:
- 啟動啟動程式
- 啟動內部守護行程
- 啟動外部程式,該程式本身將
fork()作為守護行程使用和運行 - 退出啟動程式
內部守護程式應該能夠監視外部守護程式并檢查它是否已啟動并在可能的情況下運行。這兩者之間不應出現直接通信(它們將通過 MQTT 進行通信)。
到目前為止,第 1 部分和第 2 部分都很好。現在我讀到exec()要啟動外部程式,但在這種情況下,呼叫者永遠不會回傳,因為正在等待被呼叫程式退出。
我對以下 3. 的看法是否正確?執行 exec() 并啟動程式。程式本身將fork()在后臺執行并運行,父行程將退出,因此啟動程式也將退出。但是被呼叫程式的退出不是被視為錯誤exec()嗎?
非常感謝!
/克尼布
uj5u.com熱心網友回復:
我看到了兩種可能的方法。
第一種方法:
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 子行程及其父行程退出。在第二種方法中,啟動器分叉兩個子行程,而外部程式不分叉。在這兩種方法中,都會留下兩個子守護行程并且它們的父行程已經退出,因此它們都重新成為行程的父init行程(PID 1)。
uj5u.com熱心網友回復:
1. Start launcher
|
2. fork() ------ (child)
|(launcher) |
3. exit() fork() -->internal daemon
|(child)
4. exec() ---> external program
|
fork() ----------- external daemon
|
exit()
好吧,三思而后行,我認為您的建議是更好的建議。在這兩種情況下,守護行程都會重新獲得父級,對嗎?在這兩種情況下,我都可以真正監視另一個守護行程,對嗎?
再次感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/432865.html
下一篇:ELF部分識別
