2012-05-10 3 views
6

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?

+0

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

+0

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

Antwort

0

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?

+1

EAGAIN ist ein Fehlercode, kein Signal. – pilcrow

+0

Brainfart, ich meinte Fehler. Vielen Dank. Der Fehler wird manchmal basierend auf gehandhabten Signalen erzeugt. – JimR

1

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?

Verwandte Themen