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