繁体   English   中英

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

[英]How do I check if my program has data piped into it

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

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来为你提供漂亮的颜色,那么如果将stdout传递给另一个程序,它将关闭颜色。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM