C 选择fork之后的读数

C 选择fork之后的读数,c,linux,sockets,select,multiprocessing,C,Linux,Sockets,Select,Multiprocessing,如果进程在打开udp套接字后分叉,Linux系统上如何处理读取选择? 特别是,在此类计划中是否可能: so = open socket fork for(;;) { select() for reading on socket so recv from so } 两个数据包将只唤醒其中一个进程(如果它们在等待进程被通知/退出选择之前到达),而这些数据包中的第二个将不会被接收 或者我可以假设,对于UDP,每个数据包总是会唤醒一个进程或保留标志集吗?每个进程,父进程和子进程,都有一个用于相

如果进程在打开udp套接字后分叉,Linux系统上如何处理读取选择? 特别是,在此类计划中是否可能:

so = open socket
fork
for(;;) {
  select() for reading on socket so
  recv from so
}
两个数据包将只唤醒其中一个进程(如果它们在等待进程被通知/退出选择之前到达),而这些数据包中的第二个将不会被接收


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

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


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

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


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

您的问题实际上根本不受
fork()
的影响

select()
返回读取集中的某个文件描述符是否可读。如果不从中读取并再次调用
select()
,它仍然是可读的。它将保持可读性,直到没有更多的数据可从中读取


换句话说,
select()
是级别触发的,而不是边缘触发的。

您的问题实际上根本不受
fork()
的影响

select()
返回读取集中的某个文件描述符是否可读。如果不从中读取并再次调用
select()
,它仍然是可读的。它将保持可读性,直到没有更多的数据可从中读取

换句话说,
select()
是级别触发的,而不是边缘触发的