用于运行程序的多个输入

时间:2016-04-14 15:01:59

标签: c linux bash redirect pipe

我有以下C程序:

#include<stdio.h>
main()
{
    char buf[64];
    gets(buf);
    printf("Your input: %s\n", buf);
    gets(buf);
    printf("Your input: %s\n", buf);
}

我想使用管道或重定向将数据发送到程序。问题是程序不会等待第二次获取输入新数据。

例如

$ echo "a" | ./test 

输出:

Your input: a
Your input: a

如何使用管道或重定向发送让程序等待每个用户输入。 P.S我没有写入/ proc / $ pid / fd / 0的延迟,我不必更改代码。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果使用管道|将数据输入到命令,则它将与终端的(输入部分)断开连接。 gets读取第一行"a\n"并将其作为buf写入"a\0"。然后它会到达管道末端或EOF(文件末尾)。

你的第二个gets然后什么也没做(因为在EOF之后没有什么可读的)并且只允许buf; buf仍然包含"a\0",已正式打印。

进一步提示:

  • 在进行I / O操作时,您可能会在任何时候内在地失败,您必须在每次通话后检查错误,否则会发生错误。训练自己这样做,节省大量的调试时间。

  • 永远不要像gets(buf)那样执行I / O,因为它会导致缓冲区溢出,这是计算安全性的祸根。如果输入任意数据,则必须使用允许限制写入字节数的调用。 gets的手册页包含句子&#34;从不使用此功能&#34;在顶部。您可以找到其他更好的函数,read作为基线,如果您使用的是C ++,那么还有很多其他标准解决方案。