【发布时间】:2015-07-29 03:35:42
【问题描述】:
我需要用 c 语言编写一个程序来读取和解析 STDIN。这是我的问题:我已经在 STDIN 中处理了几个错误案例(格式错误等),但如果没有提供任何内容,程序会继续监听用户输入。我希望它抛出一个错误,例如“Nothing to read”。这可能吗?
【问题讨论】:
标签: c
我需要用 c 语言编写一个程序来读取和解析 STDIN。这是我的问题:我已经在 STDIN 中处理了几个错误案例(格式错误等),但如果没有提供任何内容,程序会继续监听用户输入。我希望它抛出一个错误,例如“Nothing to read”。这可能吗?
【问题讨论】:
标签: c
如果您在类似 UNIX 的操作系统下,您可以使用select() 等待预定时间输入,如果没有,则继续。
等待来自大量不同文件描述符的输入非常方便,但如果您愿意,也可以很容易地单独用于标准输入。
或者,如果您确定它来自终端,您可以查看终端功能,使用 tcgetattr() 和 tcsetattr() 将终端置于非规范模式并设置超时:
#include <termios.h>
struct termios tio;
tcgetattr(fd, &tio); // Get current
tio.c_lflag &= ~ICANON; // Non-canonical
tio.c_cc[VTIME] = 50; // Five second timeout
tcsetattr(fd, TCSANOW, &tio); // Set new
遗憾的是,标准 (ISO) C 并没有强制要求。
【讨论】:
您的问题,如措辞,没有意义。如果输入来自类似管道的东西,则不可能知道更多输入到达之前需要多长时间。 (并且写入另一端将失败,直到有读者,尽管通常父进程仍会被视为读者,即使它实际上并没有尝试读取)。
但是,如果您只想在输入是交互式时防止挂起,则只需使用isatty(3) 并且在这种情况下不要阅读。
【讨论】:
close,read 将返回0。