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

mon*_*ing 7 c c++ stdin pipe

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

FILE *fp=stdin;
Run Code Online (Sandbox Code Playgroud)

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

gunzip -c file.gz |./a.out #should work
./a.out  #should exit program with nice msg.
Run Code Online (Sandbox Code Playgroud)

谢谢

Mik*_*one 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;
}
Run Code Online (Sandbox Code Playgroud)

实际上,这是漫长的道路.简短的方法是不使用文件指针:

#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;
}
Run Code Online (Sandbox Code Playgroud)

几个标准的Unix程序会检查它们以修改它们的行为.例如,如果你ls设置了漂亮的颜色,如果你把它的标准输出到另一个程序,它将关闭颜色.