1

仅使用低级 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);
}
4

1 回答 1

1

您不应关闭未能打开的文件描述符。

除此之外,是的,您已经对open()通话进行了足够的错误检查。现在重复其他open()调用,read()调用,write()调用,以及可能是close()主线处理一部分的close()调用——错误路径中的调用是尽力而为,不需要在同样的方法。

不过,您的错误报告并不是很有帮助。您说“file1”,但这不是文件的名称。在那里使用perror()也无济于事。我从不使用它,因为它没有让我对消息格式有足够的控制权。您文件名作为字符串传递;这比人们经常做的要好得多,但你也不能表达程序尝试的哪个操作失败了。我会与andfprintf(stderr, ...)结合使用。注意不要通过调用本身设置的函数来破坏(你的函数安全吗?)。如果您不确定,请捕获并(如有必要)将其重置为捕获的值:errnostrerror()errnoerrnotest()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()确实需要标头。

于 2013-10-29T14:51:38.660 回答