【发布时间】:2015-07-25 10:21:51
【问题描述】:
我试图了解在调用 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() 并且两个不同的文件描述符指向同一个文件呢?
【问题讨论】:
-
this 相关问题可能会有所帮助
标签: fork file-descriptor contention