Как я могу получить ошибки операции чтения в c - PullRequest
2 голосов
/ 27 мая 2011

Следующий код возвращает -1, как я могу узнать, что не так?получить подробную ошибку или что-то?

if (read(programFile, value, sizeof(FRAME)) == -1) {
        return SYSTEM_CALL;
    }

Ответы [ 5 ]

3 голосов
/ 27 мая 2011

Вам нужно взглянуть на errno, которая является переменной, установленной системными вызовами, чтобы указать на ошибку.Вы можете использовать вспомогательную функцию perror для получения удобочитаемой распечатки.

if (read(prog, value, sizeo(FRAME) == -1) {
  perror("read");
  // handle error
}

Может возвращать что-то вроде No such file or directory.В любом случае рекомендуется использовать его.

Проверьте man errno и man perror для получения дополнительной информации.

1 голос
/ 27 мая 2011

Вы можете проверить глобальную переменную errno, как указано на странице руководства,

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

В случае успеха возвращается количество фактически прочитанных байтов.После прочтения конца файла возвращается ноль.В противном случае возвращается -1 , а глобальная переменная errno устанавливается для указания ошибки.

Например,

ssize_t bytesRead = read(...);
if (bytesRead == -1) {
   switch (errno) {
      case EINVAL: return "Invalid FD";
      case EISDIR: return "FD is a directory";
      ...
   }
}
0 голосов
/ 27 мая 2011
#include <error.h>
#include <errno.h>

if (read(programFile, value, sizeof(FRAME)) == -1) {
    error (0, errno, "Damn it %s", my_string); 
    /* use nonzero as the 1st param to exit after this function */
    return SYSTEM_CALL;
}

Вы можете использовать функцию error вместе с errno. Это выведет сообщение об ошибке и пользовательскую строку, которую вы передадите в качестве аргумента.

прочее

#include <stdio.h>

if (read(programFile, value, sizeof(FRAME)) == -1) {
    perror ("Damn It!!"); 
    return SYSTEM_CALL;
}

Используйте perror для печати сообщения об ошибке и пользовательской строки.

0 голосов
/ 27 мая 2011

Errno должен быть установлен, чтобы вы могли проверить, в чем заключается ошибка.Подробнее здесь

0 голосов
/ 27 мая 2011

Из справочной страницы read:

В случае успеха количество прочитанных байтов возвращается (ноль указывает на конец файл), и положение файла продвинутый этим числом. Это не ошибка, если это число меньше количества байтов просил; это может произойти, например, потому что на самом деле меньше байтов имеется в наличии прямо сейчас (возможно, потому что мы были близки к концу файла, или потому что мы читаем из канала, или из терминала), или потому что read () было прерван сигналом. При ошибке возвращается -1 и устанавливается errno соответственно . В этом случае не указано, является ли файл позиция (если есть) меняется.

(мой акцент)

Таким образом, вы можете использовать errno и strerror для строкового описания ошибки.

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