我们正在从stdin读取文件到file_buffer
,然后进入方法more
。
一旦我们使用system("stty cbreak -echo");
,输出就会打印“stty:stdin不是终端”,并且不会将我们的终端设置为我们要求的设置。
当我们使用标准输入时,此问题才存在。如果我们使用文件参数,程序运行正常 - 终端设置已设置,并且没有错误消息。
所以,这没关系:myprogram file1.txt
但这不是:myprogram < file1.txt
无论哪种方式,内容在被使用之前都被读入file_buffer
。如果我们从stdin中获取输入,那么使用stty到底有什么问题?
答案 0 :(得分:1)
如果使用输入重定向或管道,则stdin
不是TTY。
您可以使用isatty
来检查。
答案 1 :(得分:1)
当标准输入是文件时,它不是终端,因此在stty
的标准输入上设置终端属性将不起作用。
起初听起来很愚蠢,但您可能会发现stdout
或stderr
可以使用stty
或system("stty cbreak -echo <&2");
作为stty
的输入,它会调整终端。因此:
system("stty -F /dev/stderr cbreak -echo");
可能会设置终端特性。如果您的GNU版本为/dev/stdout
,您还可以使用:
/dev/tty
或将/dev/stderr
或&2
替换为{{1}}。您还可以在第一个版本的重定向中使用任何指定的设备而不是{{1}}。