(unix / C)使用system()函数时“stty:stdin不是终端”

时间:2013-04-05 17:50:58

标签: c unix terminal system

我们正在从stdin读取文件到file_buffer,然后进入方法more

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

当我们使用标准输入时,此问题才存在。如果我们使用文件参数,程序运行正常 - 终端设置已设置,并且没有错误消息。

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

但这不是:myprogram < file1.txt

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

2 个答案:

答案 0 :(得分:1)

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

您可以使用isatty来检查。

答案 1 :(得分:1)

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

起初听起来很愚蠢,但您可能会发现stdoutstderr可以使用sttysystem("stty cbreak -echo <&2"); 作为stty的输入,它会调整终端。因此:

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

可能会设置终端特性。如果您的GNU版本为/dev/stdout,您还可以使用:

/dev/tty

或将/dev/stderr&2替换为{{1}}。您还可以在第一个版本的重定向中使用任何指定的设备而不是{{1}}。