2012-03-30 3 views
6

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

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

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

ответ

10

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

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

+3

если мы не закрыть дескриптор файла, он не будет посылать EOF к соответствующему потоку. Таким образом, в дочернем процессе он будет непрерывно ждать ввода. Но я хочу писать ограниченное количество раз в поток и читать одновременно на другом конце трубы – chaitu

+0

@chaitu: Это правда, что если вы не закрываете конец записи, конец чтения не будет показывать конец файла , Это означает, что вам нужно использовать что-то другое, кроме конца файла, чтобы обозначить конец вашего сообщения, если вы хотите отправить больше сообщений ребенку (как правило, вы должны использовать сообщение с фиксированной длиной, чтобы ребенок знал, как долго это). – caf

1

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

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

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

Исключение составляют лишь стандартный вывод и стандартный поток ошибок, чей дескриптор всегда известны как 1 и 2.

Смежные вопросы