Почему Linux повторно использует файловый дескриптор, выделенный функцией pipe () - PullRequest
2 голосов
/ 01 марта 2010

Я вижу проблему с использованием сокетов и каналов в Linux. В частности, мы вызываем pipe (), который выделяет следующие два доступных файловых дескриптора ... скажем, 10 и 11. Затем мы вызываем accept () для сокета, ожидая, что он выделит 12. Вместо этого он выделяет 11.

Мы немного протестировали, и кажется, что второй FD, возвращаемый из pipe (), всегда доступен для повторного использования другими системными вызовами, которые создают файловые дескрипторы.

Может кто-нибудь объяснить это?

Ответы [ 2 ]

4 голосов
/ 01 марта 2010

Это означает, что кто-то закрывает дескриптор файла через некоторое время после вызова pipe и до второго системного вызова. Например, если вы отключаете какой-то другой процесс для выполнения действий на одном конце канала, вы можете испортить код, закрывающий конец канала, используемого другим процессом, и закрыть неправильный конец канала. Или что-то еще, что может вызвать close в некотором файловом дескрипторе, может закрывать неправильную вещь.

0 голосов
/ 01 марта 2010

Может быть, флаг SO_REUSEADDR используется для каналов, поэтому вы не видите увеличения номера дескриптора файла?

Редактировать: Спасибо утка и Даррон за заголовки моего глупого ответа Я читал эту ссылку , и если в дескрипторе файла вызывается close(), он снова используется ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...