fork() 之前的文件描述符

File descriptors before fork()

我知道如果我在fork()之前调用open函数,进程之间共享IO指针。

如果这些进程之一关闭了调用 close(fd) 函数的文件,其他进程是否仍然能够 write/read 该文件,或者是否会为所有人关闭该文件?

是的。每个进程都有一个文件描述符的副本(除其他外)。所以关闭它的一个进程不会影响其他进程中 fd 的副本。

来自 fork() 手册:

The child inherits copies of the parent's set of open file descriptors. Each file descriptor in the child refers to the same open file description (see open(2)) as the corresponding file descriptor in the parent. This means that the two descriptors share open file status flags, current file offset, and signal- driven I/O attributes (see the description of F_SETOWN and F_SETSIG in fcntl(2)).

来自 close() 手册:

If fd is the last file descriptor referring to the underlying open file description (see open(2)), the resources associated with the open file description are freed; if the descriptor was the last reference to a file which has been removed using unlink(2), the file is deleted.

因此,如果您这样做 close(fd); 它只会关闭该进程中的引用,而持有对同一文件描述符的另一个引用的其他进程可以继续对其进行操作。

每当创建子进程时,它都会从父进程获取文件描述符的副本table。并且每个文件描述符对应一个引用计数,也就是当前访问该文件的进程数。因此,如果一个文件在主进程中打开并创建了一个子进程,则引用计数会增加,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会减少。当引用计数达到零时,文件最终关闭。