Я пытаюсь понять, что означает дублирование дескриптора файла после вызова 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 () одновременно с двумя разными файловыми дескрипторами, указывающими на один и тот же файл?