2017-08-08 62 views
1

我對linux編程相對較新。我想知道在fork()之後調用的exec()函數是否會導致父進程中的數據丟失。在fork()之後調用exec()會導致現有進程中的數據丟失

+0

哪一個? 'fork()'後面有兩個進程。 –

+2

這會導致父進程中的數據丟失0(除非它們可能會繼續共享文件描述符,否則可能會發生一些數據丟失,除非它們在子進程中關閉);並在子進程中100%的數據丟失,如果執行成功...... –

+0

有美麗的解釋[這裏](https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec )爲困惑的頭腦 –

回答

6

成功調用fork後,會創建一個與調用過程相同的新進程。有一件重複的事情是文件描述符,因此新進程可能讀取/寫入與原始進程相同的文件描述符。這些可以是文件,插座,管道等

exec功能在當前進程替換當前正在運行的程序有一個新的方案,在這個過程中覆蓋舊程序的內存。所以存儲在舊程序內存中的任何數據都會丟失。但這並不影響分叉該進程的父進程。

當一個新的程序通過exec執行,即不具有FD_CLOEXEC(近距離上的exec)標誌設置(見fcntl man page)任何打開的文件描述符再次保存。所以現在你有兩個進程,每個進程可能運行一個不同的程序,它們都可以寫入同一個文件描述符。如果發生這種情況,並且進程沒有正確同步,則一個進程寫入文件的數據可能會被另一個進程覆蓋。

因此,在寫入子進程從父進程繼承的文件描述符方面可能會發生數據丟失。

+1

*當一個新程序通過exec被執行時,打開的文件描述符被再次保留*通常,這是真的。但是打開文件描述符並且['FD_CLOEXEC'標誌設置在'exec *'調用](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/fcntl.h.html)上關閉:「'FD_CLOEXEC' Close執行* exec *系列函數時的文件描述符。「 –

+0

@AndrewHenle感謝您的支持。我在答案中包含了這些細節。 – dbush

相關問題