что произойдет, если child не закроет дескриптор файла сокета слушателя, открытый родительским элементом? - PullRequest
2 голосов
/ 20 июля 2011

что произойдет, если child не закроет дескриптор файла сокета слушателя, открытый родителем?

, какой процесс будет разбужен, если оба слушают мастер-слушатель fd?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Несколько процессов могут accept() на одном сокете.Когда соединение приходит, в зависимости от ОС, ОС может активировать один процесс или все процессы (громоподобное стадо), но в любом случае, только один процесс преуспеет в accept() создании нового соединения.

1 голос
/ 20 июля 2011

Ни один процесс не будет "разбужен", вам нужно позвонить accept(2).Вот что происходит.

Вы создаете сокет, который заставляет ядро ​​выделять много ресурсов, структуру и т. Д.

s = socket(....);

Вы устанавливаете сокет в «состояние прослушивания».Ядро замечает это и отображает один или два флага в структуре.

listen(s, -1);

You fork(2) и теперь у вас есть две копии дескриптора файла.Соединение приходит.Кто его получает?

Тот, кто звонит accept сначала .Если оба в данный момент ожидают accept, порядок определить невозможно.

Когда соединение приходит, ядро ​​добавляет его в очередь «ожидающих соединений».Когда любой процесс, у которого этот файловый дескриптор открыт, accept(2), ядро ​​удаляет одно соединение из очереди и передает его вызывающей стороне (возвращает новый файловый дескриптор).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...