仅使用低级I / O在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);
}
答案 0 :(得分:1)
您不应该关闭无法打开的文件描述符。
除此之外,是的,您已对open()
电话进行了足够的错误检查。现在重复其他open()
来电,read()
来电和write()
来电,以及可能属于主线处理的close()
来电 - { {1}}错误路径中的调用是最大的努力,不需要以相同的方式进行错误检查。
但是,您的错误报告不是很有帮助。你说'file1',但这不是文件的名称。使用close()
也不会有太大帮助;我从不使用它,因为它没有给我足够的控制消息格式。您 将文件名作为字符串传递;这比人们经常做的要好得多,但是你也不能表达程序尝试失败的操作。我将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>
的实现确实需要标题。