我对linux编程比较陌生。我想知道在exec()
之后调用的fork()
函数是否会导致父进程中的数据丢失。
答案 0 :(得分:6)
成功调用fork
后,将创建一个与调用进程重复的新进程。复制的一件事是文件描述符,因此新进程可以读取/写入与原始进程相同的文件描述符。这些可能是文件,套接字,管道等。
exec
函数用新程序替换当前进程中当前运行的程序,覆盖该进程中旧程序的内存。因此,存储在旧程序的存储器中的任何数据都将丢失。但是,这不会影响分叉此过程的父进程。
当通过exec
执行新程序时,任何未设置FD_CLOEXEC
(close-on-exec)标志的打开文件描述符(请参阅fcntl
man page)将再次出现保存。所以现在你有两个进程,每个进程可能运行一个不同的程序,它们都可以写入同一个文件描述符。如果发生这种情况,并且进程没有正确同步,则由一个进程写入文件的数据可能会被另一个进程覆盖。
因此,在写入子进程从父进程继承的文件描述符时,可能会发生数据丢失。