Я только что проверил это поведение в Linux 3.4, и его поведение таково, что ядро будет выполнять циклическое переключение среди всех дочерних элементов, которые вызывают accept()
.
Это поведение можно увидеть в следующем примере Pythonscript:
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 4242))
s.listen(10)
os.fork()
os.fork()
os.fork()
while True:
conn, addr = s.accept()
print 'I am %d and I accepted %s' % (os.getpid(), addr)
conn.close()
Это создаст 8 процессов, все привязаны к порту 4242. Затем вы можете подключиться локально через nc localhost 4242
и посмотреть, какой PID принимает подключение.
edit: ЕслиВы делаете это из более традиционного цикла select
, затем все процессы пробуждаются, и происходит вызов по вызову accept()
, при котором все процессы, кроме одного, застряли в accept()
(что плохоблокирует цикл выбора).