在fork()之后调用exec()会导致现有进程中的数据丢失

问题描述:

我对linux编程相对较新。我想知道在fork()之后调用的exec()函数是否会导致父进程中的数据丢失。在fork()之后调用exec()会导致现有进程中的数据丢失

+0

哪一个? 'fork()'后面有两个进程。 –

+2

这会导致父进程中的数据丢失0(除非它们可能会继续共享文件描述符,否则可能会发生一些数据丢失,除非它们在子进程中关闭);并在子进程中100%的数据丢失,如果执行成功...... –

+0

有美丽的解释[这里](https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec )为困惑的头脑 –

成功调用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