Читать системный вызов - PullRequest
       7

Читать системный вызов

0 голосов
/ 30 августа 2010

Я пробую свои силы в программировании сокетов Unix на C. Но, читая, я получаю Err No as 4. Я не могу найти описание этого кода ошибки. У кого-нибудь есть идеи?

Ответы [ 3 ]

2 голосов
/ 30 августа 2010

Значения errno могут быть разными для разных систем (даже для разных Unix-подобных систем), поэтому в коде следует использовать символические константы.

Функция perror будет распечатана (для stderr ) описательная строка последнего errno значения вместе с предоставленной вами строкой.

man 3 perror

Функция strerror просто возвращает const char * строке, которая perror печатает.

Если в вашей системе 4 равно EINTR, то во время разговора вы получили сигнал для чтения.Есть способы предотвратить прерывание ваших системных вызовов, но часто вам просто нужно:

while (1) {
   ssize_t x = read(file, buf, len);
   if (x < 0) {
       if (errno == EINTR) {
           errno = 0;
           continue;
       } else {
          // it's a real error
2 голосов
/ 30 августа 2010

Если вы начнете с поиска окончательного источника имен кодов ошибок Unix (/usr/include/errno.h), вы получите файл, содержащий код вашей ошибки, как

#define EINTR            4      /* Interrupted system call */

(который является этим файломосталось для вас выяснить, как упражнение;))

0 голосов
/ 31 августа 2010

Если вы получаете EINTR, это, вероятно, означает, что вы неправильно установили обработчик сигнала. Хорошие unices по умолчанию будут перезапускать системные вызовы, когда вы просто вызываете signal, но для безопасности вы должны либо использовать функцию bsd_signal, если она доступна, либо вызывать sigaction с флагом перезапуска, чтобы избежать головной боли EINTR .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...