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

时间:2017-08-08 12:13:52

标签: c linux fork exec embedded-linux

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

1 个答案:

答案 0 :(得分:6)

成功调用fork后,将创建一个与调用进程重复的新进程。复制的一件事是文件描述符,因此新进程可以读取/写入与原始进程相同的文件描述符。这些可能是文件,套接字,管道等。

exec函数用新程序替换当前进程中当前运行的程序,覆盖该进程中旧程序的内存。因此,存储在旧程序的存储器中的任何数据都将丢失。但是,这不会影响分叉此过程的父进程。

当通过exec执行新程序时,任何未设置FD_CLOEXEC(close-on-exec)标志的打开文件描述符(请参阅fcntl man page)将再次出现保存。所以现在你有两个进程,每个进程可能运行一个不同的程序,它们都可以写入同一个文件描述符。如果发生这种情况,并且进程没有正确同步,则由一个进程写入文件的数据可能会被另一个进程覆盖。

因此,在写入子进程从父进程继承的文件描述符时,可能会发生数据丢失。