2011-02-23 7 views
1

Comment sélectionner select pour la lecture sur les systèmes Linux dans le cas où le processus a été forké après l'ouverture d'une socket udp? Surtout - est-il possible que dans ce genre de programme:sélectionner pour la lecture après une fourche

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

deux paquets se réveillera que l'un des processus (au cas où ils arrivent avant que le processus d'attente est avisé/sorties sélectionner) et le second de ces paquets ne seront pas reçus?

Ou puis-je supposer que pour UDP, chaque paquet sera toujours réveiller un processus ou laisser le drapeau?

Répondre

1

Chaque processus, le parent et l'enfant, a un descripteur de même pour la FIE prise. Les attributs du descripteur de fichier sont indépendants (par exemple, blocage, possibilité de fermer le socket).

Dans votre scénario, il est en effet juridique possible pour l'un des processus, par exemple à waken et lire les données de la prise avant l'autre d'entrer dans select.

0

Votre question n'est pas réellement affectée par la fork() du tout.

select() rendements si l'un des descripteurs de fichier dans la lecture fixé est lisible. Si vous ne le lisez pas et appelez à nouveau select(), il sera toujours lisible. Il restera lisible jusqu'à ce qu'il n'y ait plus de données à lire.

En d'autres termes, select() est déclenché par niveau, non-bord déclenché.

Questions connexes