Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 捕获stdin、stdout、stderr上的错误_C_Stream_Stdout_Stdin_Stderr - Fatal编程技术网

C 捕获stdin、stdout、stderr上的错误

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

我在写一段C99代码,从stdin读取:

// [...]
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:有时候,我有一个预初始化的缓冲区,不在乎它是否被更改,但是你是对的,我应该总是关心返回值。