Поведение трубы после вилки () - PullRequest
7 голосов
/ 12 марта 2010

Читая о каналах в Advanced Programming в среде UNIX, я заметил, что после разветвления родитель может close() конец чтения канала, и он не закрывает конец чтения для дочернего элемента. Когда процесс разветвляется, сохраняются ли его файловые дескрипторы?

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

Ответы [ 3 ]

6 голосов
/ 12 марта 2010

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

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

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

2 голосов
/ 12 марта 2010

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

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

1 голос
/ 12 марта 2010

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

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

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

...