2012-10-31 7 views
8

Gibt es eine Möglichkeit, die errno herauszufinden, wenn epoll_waitEPOLLERR für eine bestimmte fd zurückgibt?Wie errno erhalten, wenn epoll_wait EPOLLERR zurückgibt?

Gibt es weitere Informationen über die Art des Fehlers?

Edit:

Weitere Informationen Hinzufügen von Mehrdeutigkeit auf einer Reihe von Datei-Deskriptoren

epoll_wait wartet zu verhindern. Wenn Sie anrufen epoll_wait Sie es eine Reihe von epoll_event Strukturen passieren:

struct epoll_event { 
      uint32_t  events; /* Epoll events */ 
      epoll_data_t data;  /* User data variable */ 
     }; 

Die epoll_data_t Struktur hat die gleichen Details wie die, die Sie mit epoll_ctl verwendet, um einen Dateideskriptor zu epoll hinzufügen:

typedef union epoll_data { 
      void *ptr; 
      int  fd; 
      uint32_t u32; 
      uint64_t u64; 
     } epoll_data_t; 

Was Ich suche nach was passiert, wenn es einen Fehler auf einem der Dateideskriptoren gibt, auf denen epoll wartet.

ie: epoll_event.events & EPOLLERR == 1 - Gibt es eine Möglichkeit, mehr Details über den Fehler im Dateideskriptor herauszufinden?

Antwort

14

Verwenden getsockopt und SO_ERROR den anstehenden Fehler auf dem Sockel

int  error = 0; 
socklen_t errlen = sizeof(error); 
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen) == 0) 
{ 
    printf("error = %s\n", strerror(error)); 
} 
+0

Sorry für die Verspätung der Antwort - das hat perfekt funktioniert - danke! :) –

-1

epoll_wait gibt -1 zurück, wenn ein Fehler auftritt, und setzt errno entsprechend. Siehe "man 2 epoll_wait" für weitere Informationen.

+1

Vielen Dank für die Antwort, aber wie Sie aus meinen Kommentaren auf die Antwort von @HongZhou sehen, das ist nicht das, wonach ich suche. Ich bin mir bewusst, dass, wenn epoll_wait für den epoll-Dateideskriptor -1 zurückgibt, ich errno verwenden kann, um den Fehler zu erhalten. Was ich suche ist, wenn epoll_event.events & EPOLLERR == 1 für einen der Dateideskriptoren epoll auf –

-4

Fügen Sie errno.h hinzu und verwenden Sie perror, um die Fehlermeldung anzuzeigen. Grundsätzlich ist der Fehler von der EPFD oder interrupt, es wird nicht aus dem Dateideskriptor in Ihrem Satz entstehen.

umfassen "errno.h"

if(epoll_wait() == -1) 
    { 
     perror("Epoll error : "); 
    } 
+0

wartet Danke für die Antwort, aber das ist nicht, was ich suche. Ich bin mir bewusst, dass, wenn epoll_wait für den epoll-Dateideskriptor -1 zurückgibt, ich errno verwenden kann, um den Fehler zu erhalten. Was ich suche ist, wenn epoll_event.events & EPOLLERR == 1 für einen der Dateideskriptoren epoll auf –

+0

wartet 1.EBADF - epfd ist kein gültiger Dateideskriptor. 2.EFAULT - Auf den Speicherbereich, auf den Ereignisse verweisen, kann nicht mit Schreibberechtigungen zugegriffen werden. 3.EINTR - Der Aufruf wurde von einem Signalhandler unterbrochen, bevor eines der angeforderten Ereignisse eintrat oder das Zeitlimit abgelaufen war. siehe Signal (7). 4.EINVAL - epfd ist kein epoll-Dateideskriptor oder maxevents ist kleiner oder gleich null. Oben sind die einzigen 4 Fehler im Mann. Unter welchen Umständen wird EPOLLER == 1? –

+0

Für Socket verwende ich dieses Flag, um nach geschlossenen Peers zu suchen: EPOLLRDHUP. –

0

Nur ein kleiner Punkt zu bekommen: Ihr Test funktioniert nicht richtig, für zwei Gründe. Wenn EPOLLERR zum Beispiel als 0x8 definiert ist, vergleicht Ihr Test 8 mit Eins (da == Vorrang vor & hat), gibt Ihnen eine Null, und dann das mit der Ereignismaske.

Sie möchten: (epoll_event.events & EPOLLERR)! = 0, um zu testen, ob das EPOLLERR-Bit gesetzt ist.

+0

Das hätte ein Kommentar sein sollen, keine Antwort – Matt

Verwandte Themen