Ни один процесс не будет "разбужен", вам нужно позвонить accept(2)
.Вот что происходит.
Вы создаете сокет, который заставляет ядро выделять много ресурсов, структуру и т. Д.
s = socket(....);
Вы устанавливаете сокет в «состояние прослушивания».Ядро замечает это и отображает один или два флага в структуре.
listen(s, -1);
You fork(2)
и теперь у вас есть две копии дескриптора файла.Соединение приходит.Кто его получает?
Тот, кто звонит accept
сначала .Если оба в данный момент ожидают accept
, порядок определить невозможно.
Когда соединение приходит, ядро добавляет его в очередь «ожидающих соединений».Когда любой процесс, у которого этот файловый дескриптор открыт, accept(2)
, ядро удаляет одно соединение из очереди и передает его вызывающей стороне (возвращает новый файловый дескриптор).
Как заключение, если дочерний процесс наследуетдескриптор файла, он просто получает свой собственный шанс принять соединения.