我需要在c中创建一个读取和解析STDIN的程序。这是我的问题:我已经在STDIN中管理了几个错误的情况(格式错误等...)但是如果没有提供,程序会一直监听用户输入。我希望它抛出一个错误,例如“无需阅读”。这可能吗?
答案 0 :(得分:2)
如果您使用的是类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没有强制要求。
答案 1 :(得分:1)
你的问题,正如措辞一样,没有意义。如果输入来自管道状的东西,则无法知道多长时间的输入到达。 (写入另一端将失败直到有读者,尽管父进程通常仍然算作读者,即使它实际上并没有尝试阅读。)
但是,如果您只想在输入交互式时阻止挂起,请使用isatty(3)
,在这种情况下不要阅读。