1

我们正在从标准输入读取一个文件到file_buffer,然后单步执行一个方法more

一旦我们使用system("stty cbreak -echo");,输出就会打印“stty: stdin is not a terminal”,并且不会将我们的终端设置为我们要求的设置。

这个问题只在我们使用标准输入时存在。如果我们使用文件参数,程序可以正常工作——终端设置被设置,并且没有错误消息。

所以,这没关系:myprogram file1.txt

但这不是:myprogram < file1.txt

无论哪种方式,内容都在被使用之前被读入file_buffer。如果我们从标准输入获取输入,那么使用 stty 到底有什么问题?

4

2 回答 2

1

如果使用输入重定向或管道,则stdin不是TTY

你可以用它isatty来检查。

于 2013-04-05T17:54:12.933 回答
1

当标准输入是文件时,它不是终端,因此在stty的标准输入上设置终端属性将不起作用。

起初听起来很愚蠢,但您可能会发现您可以使用stdoutstderr作为输入stty,它会调整终端。所以:

system("stty cbreak -echo <&2");

很可能设置终端特性。如果您有 GNU 版本stty,您还可以使用:

system("stty -F /dev/stderr cbreak -echo");

或替代/dev/stdout/dev/tty代替/dev/stderr。您还可以使用任何命名设备,而不是&2第一个变体中的重定向。

于 2013-04-05T18:06:49.993 回答