我正在编写一个应该通过标准输入读取输入的程序,所以我有以下结构。
FILE *fp=stdin;
但是如果用户没有将任何东西传送到程序中,这就会挂起,我如何检查用户是否真的像管道一样将数据传送到我的程序中
gunzip -c file.gz |./a.out #should work
./a.out #should exit program with nice msg.
谢谢
最佳答案
由于您使用的是文件指针,因此您需要 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
设置为提供漂亮的颜色,那么如果您将其标准输出通过管道传输到另一个程序,它将关闭这些颜色。
关于c++ - 如何检查我的程序是否有数据通过管道传输到其中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2564503/