fork后选择阅读

问题描述 投票:0回答:2

在打开 udp 套接字后进程被分叉时,Linux 系统上如何处理 select for read? 特别是 - 在这种程序中是否有可能:

so = open socket
fork
for(;;) {
  select() for reading on socket so
  recv from so
}

两个数据包只会唤醒其中一个进程(如果它们在等待进程被通知/退出选择之前到达),而第二个数据包将不会被接收?

或者我可以假设对于 UDP,每个数据包总是会唤醒一个进程或保留标志设置吗?

c linux sockets multiprocessing posix-select
2个回答
1
投票

每个进程(父进程和子进程)都有一个针对同一套接字的 fie 描述符。每个文件描述符属性是独立的(例如阻塞、能够关闭套接字)。

在您的场景中,其中一个进程确实是可行合法的,例如在另一个进程进入 select 之前被唤醒并从套接字读取数据。


0
投票

您的问题实际上根本不受

fork()
的影响。

如果读取集中的文件描述符之一可读,则

select()
返回。如果你不读取它并再次调用
select()
,它仍然是可读的。它将保持可读状态,直到不再有数据可供读取为止。

换句话说,

select()
是电平触发的,而不是边沿触发的。

© www.soinside.com 2019 - 2024. All rights reserved.