我正在编写一个应该通过stdin读取输入的程序,所以我有以下结构。
FILE *fp=stdin;
但是如果用户没有将任何东西输入程序,这只会挂起,如何检查用户是否实际将数据传输到我的程序中
gunzip -c file.gz |./a.out #should work
./a.out #should exit program with nice msg.
感谢
答案 0 :(得分:8)
由于您正在使用文件指针,因此您需要isatty()
和fileno()
来执行此操作:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE* fp = stdin;
if(isatty(fileno(fp)))
{
fprintf(stderr, "A nice msg.\n");
exit(1);
}
/* carry on... */
return 0;
}
实际上,这是漫长的道路。简短的方法是不使用文件指针:
#include <unistd.h>
int main(int argc, char* argv[])
{
if(isatty(STDIN_FILENO))
{
fprintf(stderr, "A nice msg.\n");
exit(1);
}
/* carry on... */
return 0;
}
几个标准的Unix程序执行此检查以修改其行为。例如,如果您设置ls
为您提供漂亮的颜色,那么如果您将其标准输出管道传输到另一个程序,它将关闭颜色。
答案 1 :(得分:3)
将stdin传递给select()或poll()会告诉您输入是否在等待。在许多操作系统下,您还可以判断stdin是tty还是管道。
编辑:我知道我将不得不强调tty测试的也部分。 fifo不是tty,但可能没有任何输入准备无限期。
答案 2 :(得分:3)
尝试“man isatty”,我认为该功能会告诉您是否与用户交谈。
答案 3 :(得分:2)
使用isatty
检测stdin是来自终端而不是重定向。
答案 4 :(得分:1)
查看函数“isatty” - 如果STDIN是终端,则可以跳过读取。如果它不是终端,您将获得数据管道或重定向,您可以阅读直到EOF。
答案 5 :(得分:0)
使用select()获得的另一个选项是设置从stdin读取的超时(相对于stdin的第一次读取或stdin的连续读取)。
对于在stdin上使用select的代码示例,请参阅: