是否可以通过管道传递到使用fpurge清除标准输入的C程序?

问题描述 投票:0回答:1

我有一个程序要求输入两次,但是在每个输入fpurge(stdin)之间都会调用。

因此,如果我想输入“ 3”,然后输入“ Hello World”,我会尝试echo "3\nHelloWorld" | program,但是该程序将只读取“ 3”,然后在读取“ Hello World”之前刷新标准输入。我尝试过将程序输入重定向到命名管道,并在关闭管道之前一次又一次地写入命名管道两次,但是没有运气。

这里是程序一部分的伪代码。

num = read_user_input("Insert number: ");
__fpurge(stdin);
name = read_user_input("Insert name: ");

有什么想法吗?谢谢。

c unix terminal pipe stdin
1个回答
1
投票

您的程序最终将读取的数据超出了解决对read_user_input的第一个调用(如果有的话)所需的数据,这将导致__fpurge丢弃其余的数据。避免这种情况的快速技巧是sleep

(echo 3; sleep 1; echo HelloWorld) | program

[这将导致第二行直到program运行后才发送到__fpurge,因此它可用于第二次调用read_user_input

当然,这有些脆弱而且容易破解,因此,如果这是您自己的程序,而不是您无法编辑其源代码的CTF,则应该对其进行重新设计以使其不起作用__fpurge

© www.soinside.com 2019 - 2024. All rights reserved.