При чтении о каналах в Усовершенствованном Программировании в Среде UNIX я заметил, что после ветвления родитель может close()
конец чтения канала и это не закрывает конец чтения для ребенка. Когда процесс разветвляется, его дескрипторы файлов становится сохраненным?
Под чем я подразумеваю, это - то, что перед ветвлением дескриптор файла чтения канала имел сохранить количество 1, и после ветвления 2. Когда родитель закрылся, его чтение примыкают, fd перешел в 1 и сохранен открытым для ребенка. Это по существу, что происходит? Это поведение также происходит для регулярных дескрипторов файлов?
Как можно прочитать на странице руководства о fork () :
Дочерний процесс должен иметь свою собственную копию дескрипторов родительского файла. Каждый из дескрипторов дочернего файла должен ссылаться на одно и то же описание открытого файла с соответствующим файловым дескриптором родительского файла.
Итак, да, у дочернего элемента есть точная копия файловых дескрипторов родителей, и это относится ко всем из них, включая открытые файлы.
Ответ - да и да (то же самое относится ко всем дескрипторам файлов, включая такие вещи, как сокеты).
В вызове fork ()
дочерний элемент получает свою собственную отдельную копию каждого дескриптора файла, каждый из которых действует так, как будто они были созданы с помощью dup ()
. A close ()
закрывает только конкретный переданный дескриптор файла - например, если вы сделаете n2 = dup (n); close (n);
, файл (канал, сокет, устройство ...), на который ссылался n
, остается открытым - то же самое относится к файловым дескрипторам, дублированным fork ()
.
Да, вилка дублирует все дескрипторы открытых файлов.
Итак, для типичного канала массив из 2 слотов (int fd [2]), fd [0] одинаков для родительского и дочернего, как и fd [1].
Вы можете создать канал вообще без разветвления и читать / писать самому себе, используя fd [0] и fd [1] в одном процессе.