如何检查我的程序是否有数据传输到其中

我正在编写一个应该通过stdin读取输入的程序,所以我有以下结构。

FILE *fp=stdin; 

但是如果用户没有将任何东西输入到程序中,这只会挂起,我如何检查用户是否实际将数据传输到我的程序中

 gunzip -c file.gz |./a.out #should work ./a.out #should exit program with nice msg. 

谢谢

由于您正在使用文件指针,因此您需要使用isatty()fileno()来执行此操作:

 #include  #include  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  int main(int argc, char* argv[]) { if(isatty(STDIN_FILENO)) { fprintf(stderr, "A nice msg.\n"); exit(1); } /* carry on... */ return 0; } 

几个标准的Unix程序执行此检查以修改其行为。 例如,如果你设置了ls为你提供漂亮的颜色,如果你将它的stdout传递给另一个程序,它将关闭颜色。

尝试“man isatty”,我认为该function会告诉您是否与用户交谈。

将stdin传递给select()或poll()应告诉您输入是否在等待。 在许多操作系统下,您还可以判断stdin是tty还是管道。

编辑:我知道我将不得不强调tty测试的一部分。 fifo不是tty,但可能没有任何输入准备好无限期的时间。

使用isatty来检测stdin来自终端而不是重定向。

查看函数“isatty” – 如果STDIN是终端,则可以跳过读取。 如果它不是终端,您将获得数据管道或重定向,您可以阅读直到EOF。

使用select()获得的另一个选项是设置从stdin读取的超时(相对于stdin的第一次读取或stdin的连续读取)。

有关在stdin上使用select的代码示例,请参阅:

如何检查stdin是否仍然没有阻塞打开?