我试图了解在调用 fork() 后复制文件描述符的含义及其对争用的可能影响。
在“Linux 编程接口”24.2.1 (p517) 中:
当执行 fork() 时,子进程接收到所有父文件描述符的副本。这些副本是以 dup() 的方式进行的,这意味着父子节点中对应的描述符引用了相同的打开文件描述。
当我运行相同的代码时:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/wait.h>
int main(void) {
char* fl = "/tmp/test_fd";
int fd;
fd = open(fl, O_CREAT|O_TRUNC|O_WRONLY, 0666);
if(!fork()) {
printf("cfd=%d\n", fd);
_exit(0);
} else {
int status;
printf("ffd=%d\n", fd);
wait(&status);
close(fd);
unlink(fl);
}
}
对于两个进程,我得到相同的文件描述符(编号?):ffd=3 和 cfd=3。但是当使用 dup() 运行这段代码时:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(void) {
char* fl = "/tmp/test_fd";
int cfd, ffd;
ffd = open(fl, O_CREAT|O_TRUNC|O_WRONLY, 0666);
cfd = dup(ffd);
printf("ffd=%d\n", ffd);
printf("cfd=%d\n", cfd);
close(ffd);
unlink(fl);
}
我得到不同的文件描述符:ffd=3 和 cfd=4。
然后,我有以下问题:
- 什么意味着 fork() 创建了父文件描述符的副本?
- 当两个进程(父进程和子进程)在同一个文件描述符上同时执行 fstat() 之类的操作时,是否存在争用?
- 如果两个进程同时执行 fstat() 并且两个不同的文件描述符指向同一个文件呢?