我對linux編程相對較新。我想知道在fork()
之後調用的exec()
函數是否會導致父進程中的數據丟失。在fork()之後調用exec()會導致現有進程中的數據丟失
回答
成功調用fork
後,會創建一個與調用過程相同的新進程。有一件重複的事情是文件描述符,因此新進程可能讀取/寫入與原始進程相同的文件描述符。這些可以是文件,插座,管道等
的exec
功能在當前進程替換當前正在運行的程序有一個新的方案,在這個過程中覆蓋舊程序的內存。所以存儲在舊程序內存中的任何數據都會丟失。但這並不影響分叉該進程的父進程。
當一個新的程序通過exec
執行,即不具有FD_CLOEXEC
(近距離上的exec)標誌設置(見fcntl
man page)任何打開的文件描述符再次保存。所以現在你有兩個進程,每個進程可能運行一個不同的程序,它們都可以寫入同一個文件描述符。如果發生這種情況,並且進程沒有正確同步,則一個進程寫入文件的數據可能會被另一個進程覆蓋。
因此,在寫入子進程從父進程繼承的文件描述符方面可能會發生數據丟失。
*當一個新程序通過exec被執行時,打開的文件描述符被再次保留*通常,這是真的。但是打開文件描述符並且['FD_CLOEXEC'標誌設置在'exec *'調用](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/fcntl.h.html)上關閉:「'FD_CLOEXEC' Close執行* exec *系列函數時的文件描述符。「 –
@AndrewHenle感謝您的支持。我在答案中包含了這些細節。 – dbush
- 1. 爲什麼在linux上執行fork或exec之後RLIMIT_STACK會丟失?
- 2. 在C中的fork()之後在進程之間共享數據
- 3. 在函數中調用fork()後不會打印主進程
- 4. AWS RDS - 降級數據庫實例類會導致現有數據丟失嗎?
- 5. 在exec()之前有什麼用fork()?
- 6. iOS 5中的NSDocumentDirectory導致應用程序數據丟失
- 7. pthread_atfork()多次調用導致fork()函數被多次調用後
- 8. 交換機中的多個fork()導致指數exec
- 9. 會話值在調用之間丟失
- 10. 程序在使用管道,fork和exec之後掛起
- 11. fork調用子進程和父進程之後,值之間會有什麼不同?
- 12. 使用exec/fork運行外部進程
- 13. 快速插入導致數據丟失
- 14. 更新按鈕導致數據丟失!
- 15. Angular2在導航後丟失數據
- 16. Node.js子進程中的數據丟失
- 17. 什麼會導致Application_Start導致會話丟失?
- 18. 調用的QApplication :: EXEC()了QDialog :: EXEC()之後
- 19. .htaccess文件導致Chrome丟失會話數據
- 20. 會降級mysql 5.5到mysql 5.0或5.1導致數據丟失?
- 21. openpyxl導致excel中現有的DataValidation丟失
- 22. Pipe,Fork和Exec - 父子進程之間的雙向通信
- 23. 實現ActionBarCompat導致r.java文件丟失
- 24. gdb調試fork後的子進程
- 25. 在析構函數中調用PDO :: exec()會掛起PHP進程
- 26. 將創建多少個進程fork()exec()
- 27. fork()和exec()兩個子進程
- 28. perl fork()exec(),子進程狂放
- 29. 導航,而不會丟失數據
- 30. iOS 5 - Coredata Sqlite數據庫在丟失應用程序後丟失數據
哪一個? 'fork()'後面有兩個進程。 –
這會導致父進程中的數據丟失0(除非它們可能會繼續共享文件描述符,否則可能會發生一些數據丟失,除非它們在子進程中關閉);並在子進程中100%的數據丟失,如果執行成功...... –
有美麗的解釋[這裏](https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec )爲困惑的頭腦 –