我正在尝试理解在调用fork()后复制文件描述符的含义以及它可能对争用产生的影响。
在《Linux编程接口》第24.2.1节(p517)中提到:
当执行fork()时,子进程会收到父进程所有文件描述符的副本。这些副本是通过dup()方式创建的,这意味着父进程和子进程中对应的文件描述符都指向同一个打开的文件描述符。
当我运行相同的代码时:
在《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()时会怎样?