如何中断标准输入流以便进行另一个操作

3

这个问题可能有点难以描述。例如,一个程序从 stdin 接收一个字符串,但它需要用户进行交互式输入,像这样:

echo "Some text to handle later after command is specified" | a.out 

在程序的开头:

printf("Please input command first");
scanf("%s", &cmd);
/* Some Code Here */
/* process "Some text to handle later after command is specified" */

有没有办法“暂停”之前的输入流,等待scanf输入?
2个回答

1
当使用管道时,shell会将程序的stdin设置为前一个命令的输出。因此读取不应该是一个问题。
问题在于,如果输入来自管道(或重定向),则不应打印任何输出。这可以通过检查isatty函数的结果来实现:
if (isatty(fileno(stdin)))
{
    /* Only print prompt if input is an interactive terminal */
    printf(...);
}

scanf(...);

或者我误解了你的意思,你想要从用户和管道中都读取内容吗?那么你可能需要直接连接终端。

为此,您可以使用 ttyname 来获取 stdout 的 TTY 设备名称,并打开该设备以读取用户输入。如果 stdout 也导向管道(或正在被重定向),则这种方法将不起作用。


1
标准没有指定除了从stdin读取之外获取交互式用户输入的任何方式。由于stdin被管道占用,因此您需要走一个特定于实现的路径。
对于类Unix系统来说,这将是一个名为/dev/tty的特殊文件。打开它并使用普通的stdio函数。
在Windows上,您可能需要调用Console API。
不能保证程序连接到任何交互设备,所以要做好失败的准备。
请注意,以这种方式编写程序被认为是不好的风格。如果期望有任何用户输入,则良好编写的程序应该只使用stdin。然后,所有其他输入流都应通过命令行参数传递为文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接