Lire le système d’appel

J’essaie de me débrouiller avec la programmation de socket unix en C. Mais pendant la lecture, je reçois Err No comme 4. Je n’arrive pas à trouver la description de ce code d’erreur. Est-ce que quelqu’un a une idée?

Si vous commencez par regarder la source ultime des noms de codes d’erreur Unix ( /usr/include/errno.h ), vous arriverez au fichier qui contient votre code d’erreur en tant que

 #define EINTR 4 /* Interrupted system call */ 

(Quel est ce fichier est laissé pour vous de découvrir, comme un exercice;))

Les valeurs d’ errno peuvent être différentes pour différents systèmes (même pour différents systèmes Unix), donc les constantes symboliques doivent être utilisées dans le code.

La fonction perror imprimera (à stderr ) une chaîne descriptive de la dernière valeur d’ errno avec une chaîne que vous fournissez.

 man 3 perror 

La fonction strerror renvoie simplement un caractère const char * à la chaîne imprimée.

Si 4 est EINTR sur votre système, vous avez reçu un signal pendant votre appel pour lire. Il existe des moyens d’empêcher cette interruption de vos appels système, mais il suffit souvent de:

 while (1) { ssize_t x = read(file, buf, len); if (x < 0) { if (errno == EINTR) { errno = 0; continue; } else { // it's a real error 

Si vous obtenez EINTR , cela signifie probablement que vous avez mal installé un gestionnaire de signaux. Si vous appelez simplement le signal , les bons systèmes s’appliquent par défaut à des appels système réitérables, mais pour des raisons de sécurité, vous devez utiliser la fonction bsd_signal si elle est disponible ou appeler sigaction avec le drapeau redémarrable pour éviter les problèmes d’ EINTR .