Что такое "полное отслеживание ошибок"?

Напишите программу на C, используя только низкоуровневый ввод-вывод.

Программа должна иметь полное отслеживание ошибок. В частности, программа должна использовать perror() для сообщения о системных ошибках...

В моей программе...

test("checked argument count");


if((input_file1 = open(argv[1], O_RDONLY)) < 0)
{
    test("couldn't open file1");
    perror(argv[1]);
    close(input_file1);
    exit(1);
}
test("opened file1");

Будет ли это рассматриваться как "полное отслеживание ошибок", если я реализую такой код для каждой попытки чтения / записи?

Примечание: test() только для отладки и будет удален позже:

void test(const char * message)
{
    printf("\ttesting: %s \n", message);
}

1 ответ

Вы не должны закрывать файловый дескриптор, который вам не удалось открыть.

Кроме этого, да, вы сделали достаточную проверку ошибок на open() вызов. Теперь повторите для другого open() звонки, а read() звонки, а write() звонки, и, вероятно, close() звонки, которые являются частью обработки основной линии - close() вызовы в путях ошибок - лучшее усилие и не должны быть проверены на ошибку таким же способом.

Ваши сообщения об ошибках не очень полезны. Вы говорите "file1", но это не имя файла. С помощью perror() там тоже мало что поможет; Я никогда не использую его, потому что он не дает мне достаточного контроля над форматом сообщения. Вы передаете имя файла в виде строки; это значительно лучше, чем люди часто делают, но вы также не можете выразить, какая операция была предпринята программой, которая не удалась. Я бы использовал fprintf(stderr, ...) в сочетании с errno а также strerror(), Будьте осторожны, чтобы не забить errno вызывая функцию, которая сама устанавливает errno (твой test() функция безопасна?). Если вы не уверены, захватите errno и (при необходимости) сбросьте его до захваченного значения:

int errnum = errno;
test("couldn't open file", argv[1]);
errno = errnum;
perror(argv[1]);
exit(1);

Пересмотренный test() функция может быть:

#include <stdarg.h>
extern void test(char const *fmt, ...);
void test(char const *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    putc('\n', stderr);
}

Это суть этого; вам нужно адаптировать это для работы с текущими внутренними test() функция. Декларация test() с многоточием не требует <stdarg.h> заголовок; реализация test() действительно требует заголовка.

Другие вопросы по тегам