2016-05-02 13 views
1

Ich verwende recv(), um Daten von einem Socket und fcntl() zu lesen, um den Socket blocking/non-blocking zu setzen. Meine Frage ist: Wenn ich recv() (Blockierung) anrufe und ich fcntl() von einem anderen Thread anrufe und den Socket nicht sperrend einstelle, wird der gerade laufende recv() Return oder der Effekt von fcntl() erst nach der Blockierung recv() zurückgehen und ich rufe es an nochmal?Blockierung recv() vs fcntl()

+2

Probieren Sie es aus. Es ist seltsam, dass ein Socket sowohl blockierend als auch nicht blockierend sein soll und dass ein anderer Thread mit dem Status "diddle" ist. Unter Linux würde ich den Socket bei der Erstellung mit socket() auf dem Client und accept4() auf dem Server nicht blockieren. –

+0

Versuchen Sie nur asynchron einen Thread aufzuwecken, der bei einem 'Recv'-Anruf blockiert ist? Wenn ja, gibt es wahrscheinlich einen besseren/sichereren Weg, dies zu tun, selbst wenn 'fcntl' das gewünschte Ergebnis liefert. Verwenden Sie zum Beispiel 'poll', um den externen' recv'-Socket zu blockieren * oder * einen internen Socket, der nur für Benachrichtigungen innerhalb von Prozessen verwendet wird. –

+0

@BrianMcFarland Dies ist genau das, was ich vorhabe, aber da es nicht funktionieren würde (laut EJP's Antwort), werde ich Ihre Ideen untersuchen. Vielen Dank! –

Antwort

2

Es hat keinen Einfluss auf den aktuellen Empfangsvorgang.

Seltsame Sache zu tun.

+0

Danke für die Antwort! Ich wollte den blockierenden Thread mit dieser Methode aufwecken, aber ich denke, ich werde mir andere Optionen ansehen. –

+0

@BertalanRadostyan: "* Ich wollte den blockierenden Thread aufwecken *" Sende dem Thread einfach ein Signal (stelle sicher, dass 'SA_RESTART' nicht der Signal-Handler ist). – alk