Как заново открыть закрытый дескриптор файла - PullRequest
7 голосов
/ 30 марта 2012

У меня есть сценарий, где я создал канал для связи между двумя дочерними и родительскими. Родитель записывает (используя функцию записи) данные в канал и закрывает соответствующий файловый дескриптор. Проблема в том, что когда я хочу снова записать данные в канал, функция записи возвращает код ошибки -1. Я думаю, потому что конец записи был закрыт в предыдущей итерации. Тогда как открыть соответствующий файловый дескриптор после того, как он был закрыт один раз.

Я попытался использовать функцию open (), которая требует путь к какому-либо файлу в качестве аргумента. Но я не использую никаких файлов в моем приложении. У меня есть простые файловые дескрипторы (int arr [2]).

Можно ли достичь вышеописанного сценария с трубами ????

Ответы [ 2 ]

11 голосов
/ 30 марта 2012

Как только труба закрыта, она закрыта.Вы не можете вернуть его обратно.

Если вы хотите написать больше, не закрывайте его в первую очередь - это так просто.

1 голос
/ 03 апреля 2012

Что нужно знать обо всем, что связано с файлами (каналы также являются своего рода файлами) в Unix: имя файла используется только при открытии файла. Позже, до тех пор, пока файл не будет открыт, он будет доступен навсегда, пока он не будет закрыт и имя больше никогда не будет использоваться Когда кто-то удаляет файл в другом окне, когда оно открыто, просто исчезает имя, а не файл. Это значит:

  1. Файл все еще находится на диске
  2. У него нет имени
  3. Он все еще открыт
  4. Когда оно закрыто, ядро ​​удаляет его навсегда

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

Единственными исключениями являются stdout и stderr, дескриптор которых всегда известен как 1 и 2.

...