在打开 udp 套接字后进程被分叉时,Linux 系统上如何处理 select for read? 特别是 - 在这种程序中是否有可能:
so = open socket
fork
for(;;) {
select() for reading on socket so
recv from so
}
两个数据包只会唤醒其中一个进程(如果它们在等待进程被通知/退出选择之前到达),而第二个数据包将不会被接收?
或者我可以假设对于 UDP,每个数据包总是会唤醒一个进程或保留标志设置吗?
每个进程(父进程和子进程)都有一个针对同一套接字的 fie 描述符。每个文件描述符属性是独立的(例如阻塞、能够关闭套接字)。
在您的场景中,其中一个进程确实是可行合法的,例如在另一个进程进入 select 之前被唤醒并从套接字读取数据。
您的问题实际上根本不受
fork()
的影响。
如果读取集中的文件描述符之一可读,则 select()
返回。如果你不读取它并再次调用select()
,它仍然是可读的。它将保持可读状态,直到不再有数据可供读取为止。
换句话说,
select()
是电平触发的,而不是边沿触发的。