fork()后调用exec()会不会导致现有进程数据丢失

Will exec() called after fork() cause data loss in the existing process

我对 linux 编程比较陌生。 fork()之后调用的exec()函数会不会导致父进程丢失数据

成功调用 fork 后,将创建一个新进程,它是调用进程的副本。复制的一件事是文件描述符,因此新进程有可能 read/write 使用与原始进程相同的文件描述符。这些可能是文件、套接字、管道等。

exec函数将当前进程中的运行程序替换为新程序,覆盖该进程中旧程序的内存。因此,旧程序内存中存储的所有数据都将丢失。但是,这不会影响派生此进程的父进程。

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

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