gpt4 book ai didi

c - 什么是 "complete error trapping"?

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:29 24 4
gpt4 key购买 nike

Write a program in C using only low-level I/O..

The program must have complete error trapping. In particular theprogram should use perror() to report system errors...

在我的程序中...

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);
}

最佳答案

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

除此之外,是的,您已经对 open() 进行了充分的错误检查称呼。现在对另一个重复 open()电话,以及 read()电话,以及 write()电话,大概是 close()作为主线处理一部分的调用 — close()错误路径中的调用是尽力而为,不需要以相同的方式进行错误检查。

不过,您的错误报告不是很有帮助。您说的是“file1”,但这不是文件的名称。使用 perror()在那里也不会有太大帮助;我从不使用它,因为它无法让我对消息格式进行足够的控制。您将文件名作为字符串传递;这比人们经常做的要好得多,但您也无法表达程序正在尝试失败的操作。我会用 fprintf(stderr, ...)连同errnostrerror() .小心不要破坏 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> header ;实现test()确实需要 header 。

关于c - 什么是 "complete error trapping"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com