Поведение канала после ветвления ()

При чтении о каналах в Усовершенствованном Программировании в Среде UNIX я заметил, что после ветвления родитель может close() конец чтения канала и это не закрывает конец чтения для ребенка. Когда процесс разветвляется, его дескрипторы файлов становится сохраненным?

Под чем я подразумеваю, это - то, что перед ветвлением дескриптор файла чтения канала имел сохранить количество 1, и после ветвления 2. Когда родитель закрылся, его чтение примыкают, fd перешел в 1 и сохранен открытым для ребенка. Это по существу, что происходит? Это поведение также происходит для регулярных дескрипторов файлов?

8
задан Stephen Melvin 14 May 2013 в 16:27
поделиться

3 ответа

Как можно прочитать на странице руководства о fork () :

Дочерний процесс должен иметь свою собственную копию дескрипторов родительского файла. Каждый из дескрипторов дочернего файла должен ссылаться на одно и то же описание открытого файла с соответствующим файловым дескриптором родительского файла.

Итак, да, у дочернего элемента есть точная копия файловых дескрипторов родителей, и это относится ко всем из них, включая открытые файлы.

6
ответ дан 5 December 2019 в 17:36
поделиться

Ответ - да и да (то же самое относится ко всем дескрипторам файлов, включая такие вещи, как сокеты).

В вызове fork () дочерний элемент получает свою собственную отдельную копию каждого дескриптора файла, каждый из которых действует так, как будто они были созданы с помощью dup () . A close () закрывает только конкретный переданный дескриптор файла - например, если вы сделаете n2 = dup (n); close (n); , файл (канал, сокет, устройство ...), на который ссылался n , остается открытым - то же самое относится к файловым дескрипторам, дублированным fork () .

3
ответ дан 5 December 2019 в 17:36
поделиться

Да, вилка дублирует все дескрипторы открытых файлов.

Итак, для типичного канала массив из 2 слотов (int fd [2]), fd [0] одинаков для родительского и дочернего, как и fd [1].

Вы можете создать канал вообще без разветвления и читать / писать самому себе, используя fd [0] и fd [1] в одном процессе.

1
ответ дан 5 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: