2011-02-23 55 views
1

如果在打開udp套接字後進程分叉的情況下,在Linux系統上如何選擇閱讀進行處理? 特別 - 是有可能,在這種方案:選擇分叉後閱讀

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

兩個包會醒來只(他們到達通知等待進程前/退出選擇的情況下)的過程和的第二個中的一個那些數據包將不會被接收?

或者我可以假設對於UDP,每個數據包總是會喚醒進程或保留標誌位?

回答

1

每個進程(父進程和子進程)具有相同套接字的fie描述符。每個文件描述符屬性是獨立的(例如,阻塞,能夠關閉套接字)。

在您的場景中,其中一個進程確實可行,例如在另一個進入select之前喚醒並從套接字讀取數據。

0

您的問題實際上並沒有受到fork()的影響。

select()如果讀取集合中的某個文件描述符可讀,則返回。如果您沒有閱讀並再次致電select(),它仍然是可讀的。它將保持可讀性,直到沒有更多數據可以從中讀取。

換句話說,select()是電平觸發的,而不是上升沿觸發。