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