C 捕获stdin、stdout、stderr上的错误
我在写一段C99代码,从stdin读取:C 捕获stdin、stdout、stderr上的错误,c,stream,stdout,stdin,stderr,C,Stream,Stdout,Stdin,Stderr,我在写一段C99代码,从stdin读取: // [...] fgets(buf, sizeof(buf), stdin); // [...] 但是我想知道在这种情况下是否应该捕获错误,因为shell可以将stdin重定向到任何可能不如普通stdin健壮的地方。但这也意味着,必须检查stdin、stdout和stderr上的每个访问是否有错误,并且我很少看到在printf和co之后的任何检查 那么,是否建议检查每个流访问是否存在错误 然后,上面的示例将类似于: // [...] if (!fge
// [...]
fgets(buf, sizeof(buf), stdin);
// [...]
但是我想知道在这种情况下是否应该捕获错误,因为shell可以将stdin
重定向到任何可能不如普通stdin
健壮的地方。但这也意味着,必须检查stdin
、stdout
和stderr
上的每个访问是否有错误,并且我很少看到在printf
和co之后的任何检查
那么,是否建议检查每个流访问是否存在错误
然后,上面的示例将类似于:
// [...]
if (!fgets(buf, sizeof(buf), stdin) && ferror(stdin)) {
exit(EXIT_FAILURE);
}
// [...]
提前谢谢 这取决于您正在开发的应用程序的性质。例如,如果您正在开发一个硬实时系统,其异常终止会导致严重问题。然后,您应该采取预防措施来处理各种数据流错误。在这种情况下,请使用以下代码:
if (!fgets(buf, sizeof(buf), stdin) && ferror(stdin)) {
exit(EXIT_FAILURE);
}
或者类似的构造。但是,如果应用程序的罕见故障不会产生任何严重后果,则不需要检查每个数据流操作 这取决于您正在开发的应用程序的性质。例如,如果您正在开发一个硬实时系统,其异常终止会导致严重问题。然后,您应该采取预防措施来处理各种数据流错误。在这种情况下,请使用以下代码:
if (!fgets(buf, sizeof(buf), stdin) && ferror(stdin)) {
exit(EXIT_FAILURE);
}
或者类似的构造。但是,如果应用程序的罕见故障不会产生任何严重后果,则不需要检查每个数据流操作 每次使用时都必须检查
fgets()
中的返回值。如果没有,则不知道缓冲区中是否有有用的数据;它可以第二次保持最后一行。类似的注释适用于每个读取操作;您必须检查读取操作是否返回了预期的结果
if (fgets(buf, sizeof(buf), stdin) == 0)
...EOF, or some error...
在处理代码中,您需要决定要做什么。您可以合法地在该代码中使用feof()
和ferror()
。对问题的正确反应取决于您的代码。检测到EOF通常是退出循环或退出函数的原因(break
或return
,但您仅在函数未打开文件时返回;否则您至少必须关闭文件)。在stdin
上检测错误将是罕见的事情;你必须决定该做什么
在写入
stderr
或stdout
时检测错误是不太常做的事情,但忽略它们可能是草率的编程。有一个问题,特别是如果是stderr
有问题,那就是“如何报告错误?”您可能需要使用syslog()
,但这是您必须考虑的问题。每次使用它时,您都必须检查fgets()
的返回值。如果没有,则不知道缓冲区中是否有有用的数据;它可以第二次保持最后一行。类似的注释适用于每个读取操作;您必须检查读取操作是否返回了预期的结果
if (fgets(buf, sizeof(buf), stdin) == 0)
...EOF, or some error...
在处理代码中,您需要决定要做什么。您可以合法地在该代码中使用feof()
和ferror()
。对问题的正确反应取决于您的代码。检测到EOF通常是退出循环或退出函数的原因(break
或return
,但您仅在函数未打开文件时返回;否则您至少必须关闭文件)。在stdin
上检测错误将是罕见的事情;你必须决定该做什么
在写入
stderr
或stdout
时检测错误是不太常做的事情,但忽略它们可能是草率的编程。有一个问题,特别是如果是stderr
有问题,那就是“如何报告错误?”您可能需要使用syslog()
,但这是您必须考虑的问题。这里有一个有趣的练习。找到某人的交互式程序,运行它,直到它要求从终端输入,然后按control-D(EOF)。很可能作者没有检查feof(stdin),他的get()调用只返回0字节,代码将其解释为空行。如果它将其作为无效输入并重新提示,它将以无限循环结束 这是一个有趣的练习。找到某人的交互式程序,运行它,直到它要求从终端输入,然后按control-D(EOF)。很可能作者没有检查feof(stdin),他的get()调用只返回0字节,代码将其解释为空行。如果它将其作为无效输入并重新提示,它将以无限循环结束 谢谢,我以前从未听说过syslog。很高兴知道。但是关于EOF:有时候,我有一个预初始化的缓冲区,不在乎它是否被更改,但是你是对的,我应该总是关心返回值。谢谢,我以前从未听说过syslog。很高兴知道。但是关于EOF:有时候,我有一个预初始化的缓冲区,不在乎它是否被更改,但是你是对的,我应该总是关心返回值。