我的程序(一个文本编辑器)像这样进入终端的原始模式:
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw)
以便它可以读取按键,使用转义码进行绘制等
但是现在我想这样做:echo hello | myprog
,从管道中读取stdin,然后在程序UI中显示它。但是现在STDIN_FILENO指向一个管道而不是一个终端,tcsetattr
与improper ioctl
一起失败。当作为管道的目的地时,我如何得到实际终端的fd
?
通常,/dev/tty
是当前控制台,如果您不需要stdio接口,您可以使用int ttyfd = open("/dev/tty", O_RDWR)
打开它,接收fd。(在同一设备上混合Unix I/O和studio I/O通常不是一个好主意。但是如果你真的想,用FILE* ftty = fopen("/dev/tty", "rw");
打开,用fileno(ftty)
从FILE*
中取出fd。