Ich habe einen Code, der periodisch recv()
aufruft (mit einem MSG_DONTWAIT
Flag). Ich bin neugierig, weil Profiling mein Code in VTune, sehe ich eine sigprocmask()
Aufruf mit der recv()
verbunden ist, und es dauert einen großen Teil der Gesamtzeit, um auszuführen. Ich bin neugierig, warum recv()
ruft sigprocmask()
.Warum wird sigprocmask beim Aufrufen des recv-Systemanrufs angerufen?
Antwort
Wahrscheinlich kann Recv feststellen, ob relevante Signale erzeugt werden, die sonst nicht zu sehen wären, wenn diese Signale blockiert wären. EAGAIN/EWOULDBLOCK fallen als Werte von Fehlern auf, die manchmal unter Verwendung von Signalen erzeugt werden, die möglicherweise blockiert werden könnten. Haben Sie sich die sigprocmask
man page angesehen?
Wenn Sie mit TCP-Socket unter Linux arbeiten, erhalten Sie SIGPIPE, wenn die andere Seite unerwartet geschlossen wird.
Da Sie dieses Signal maskiert (die meiste Zeit, werden Sie den Rückgabewert von 0 behandeln sich selbst, Sie über dieses Signal nicht kümmern), ich denke, die Systembibliothek überprüft den Signalzustand, und wenn maskiert, verwenden Sie einen schnelleren Codepfad.
Wenn nicht, kann es nicht optimieren.
BTW, wissen Sie über pselect() richtig?
- 1. BroadcastReceiver wird angerufen, aber PhoneStateListener wird nicht
- 2. Remote-Benachrichtigungs-Callback wird während des Telefonats nicht angerufen
- 3. Android - Welche Google API beim Eintreffen der Benachrichtigung angerufen wird
- 4. Android: onTouch() wird nie angerufen?
- 5. Set und Oldset in sigprocmask()
- 6. Facebook LoginButton Rückruf wird nicht angerufen
- 7. PhoneStateListener onMessageWaitingIndicatorChanged() wird nicht zuverlässig angerufen
- 8. fbDidLogin nicht angerufen
- 9. GDB: Haltepunkt beim Aufrufen des Destruktors eines bestimmten Objekts
- 10. Delegat nicht angerufen
- 11. Warum wird Application_BeginRequest() beim Aktualisieren des Browsers zweimal ausgelöst?
- 12. Warum wird beim Einrichten des PhantomJS-Treibers ein Fehler angezeigt?
- 13. SKPaymentQueue updatedTransactions nicht angerufen
- 14. Warum viewdidlayoutsubviews mehrmals aufrufen?
- 15. XmlHttpRequest.onload nicht angerufen
- 16. Andere Felder hinzufügen, wenn ein Fremdschlüssel angerufen wird
- 17. Netty Handler nicht angerufen
- 18. WCF-Test Clientfehler: Fehler beim Aufrufen des Dienstes
- 19. Android: NetworkOnMainThreadException nicht angerufen
- 20. Aktualisieren der Benutzeroberfläche beim Aufrufen des Webdienstes mit sendSynchronousRequest
- 21. Aufrufen einer Methode beim Anmelden des Benutzers Django
- 22. Warum wird meine Animation beim Aufrufen eines Abschlusses im Hauptthread ignoriert?
- 23. Warum base.OnStop() aufrufen, wenn Windows Service gestoppt wird?
- 24. Manchmal wird der Service angerufen und manchmal nicht
- 25. ObservableCollection.CollectionChanged nicht angerufen werden
- 26. textFieldDidBeginEditing: nicht angerufen
- 27. Verhindern, dass ein Web-Service zu oft angerufen wird
- 28. On click Listener zweimal angerufen
- 29. Fehler beim Aufrufen des WCF-Dienstes von der Silverlight-Anwendung?
- 30. Domänenübergreifender Zugriffsfehler beim Aufrufen des WCF-Diensts von Silverlight
Können wir eine relevante Spur des kleinstmöglichen Codes sehen, der dieses Verhalten reproduziert? Können wir diesen Demo-Code auch sehen? Es wäre aufschlussreich zu sehen, was genau mit der Signalmaske gemacht wird. – pilcrow
Können Sie den Kontext dieser Aufrufe von 'recv()' näher erläutern? Welche Art von Steckdose verwendest du? Rufen Sie 'recv()' direkt an? – alk