2012-04-15 22 views
1

Ich arbeite an einem Pthread Multithread-Code und jeder Thread ruft read() auf einem Dateideskriptor. read() ist ein blockierender Aufruf, der auf Daten wartet. Aber ich möchte, dass es nur 3 Sekunden wartet, um auf Daten zu warten.setTimeOut Entspricht in c?

Ich dachte an die Verwendung von alarm() und hadling SIGALRM aber wenn ich Alarm in einem Thread auslösen, werden alle Threads dieses SIGALRM-Signal bekommen und alle von ihnen werden auflesen. Wie kann ich es tun?

Antwort

5

Verwenden Sie den select Aufruf dafür. Es gibt ein Argument, mit dem Sie eine Zeitüberschreitung festlegen können.

Die Linux-Manpage für select hat eine Beispielverwendung, und Sie finden viele Beispiele hier und anderswo im Web.

Wenn Sie sich keine Sorgen um Portabilität machen, gibt es modernere/bessere Optionen.

Sie können in Bibliotheken zu abstrakt aussehen wollen, dass alle aus. libevent ist einen Blick wert und umschließt die meisten der oben genannten Betriebssystem-spezifischen Schnittstellen.

+0

select ist veraltet. epoll ist das, was Menschen heutzutage benutzen. –

+0

oh ja, ich denke, das sollte funktionieren. Ich habe nie darüber nachgedacht, select() zu verwenden. Ich habe nie ausgewählt() für etwas anderes als Multiplexing. –

+0

@VladLazarenko: "Deprecated" ist ein bisschen eine starke Formulierung dafür. 'epoll' ist nicht tragbar, und' select' wird in absehbarer Zeit nicht verschwinden. Sicher, es gibt modernere Alternativen, aber sie sind auch (IMO) oft schwerer zu bekommen. – Mat