Linux автоматически освобождает безымянный канал после закрытия обоих файловых дескрипторов? - PullRequest
5 голосов
/ 09 декабря 2010

Я использую безымянный канал для межпроцессного взаимодействия между родительским процессом и дочерним процессом, созданным с помощью fork ().Я использую функцию pipe (), включенную в unistd.h

. Я бы предположил, что после закрытия обоих файловых дескрипторов (и в обоих процессах) канал освобождается / освобождается / уничтожается / и т.д.Но я не нашел на страницах руководства ничего такого, что бы говорило об этом окончательно.Я делаю программу, которая будет работать очень долго, поэтому я хочу предотвратить утечки памяти и другие подобные вещи.

Мое тело функции выглядит примерно так:

int pipefds[2];

pipe( pipefds );

if ( fork() == 0 ) {

    close( pipefds[1] );
    ...
    //Use pipefds[0]
    close( pipefds[0] );

} else {

    close( pipefds[0] );
    ...
    //Use pipefds[1]
    close( pipefds[1] );
}

Безопасно ли предположить, что после того, как эта функция завершается как у потомка, так и у родителя, канал был освобожден / освобожден / уничтожен / и т.д.?

Есть ли какие-либо документы, в которых говорится об этом окончательно?

Спасибо

Ответы [ 3 ]

6 голосов
/ 09 декабря 2010

http://www.opengroup.org/onlinepubs/009695399/functions/close.html

Когда все файловые дескрипторы, связанные с каналом или специальным файлом FIFO, закрыты, все данные, оставшиеся в канале или FIFO, будут отброшены.

На самом деле не говорит о том, что все ресурсы освобождены, поскольку внутренние ядра ядра не "данные, остающиеся в канале", но я думаю, что мы можем смело предположить, что если ваше ядро ​​сохранит что-либо после этого, этобизнес вашего ядра и ни одного из вас: -)

5 голосов
/ 09 декабря 2010

Документация close говорит об этом.

 The close() call deletes a descriptor from the per-process object reference
 table.  If this is the last reference to the underlying object, the
 object will be deactivated.
0 голосов
/ 09 декабря 2010

Ну, единственное, что вы можете сделать, это закрыть оба конца трубы, верно?Да, труба будет освобождена после закрытия всех ручек на обоих концах трубы.

...