Что такое "полное отслеживание ошибок"?
Напишите программу на 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()
действительно требует заголовка.