我查看了转义码,发现了一些读取当前光标位置的 C 代码。我想我现在偶然发现了一个 UNIX/POSIX 编程主题,我之前还没有太多接触过。
下面的代码dev/tty
以读写模式打开,并将适当的转义代码写入文件描述符,然后通过从文件描述符读取来接收答案。所以以编程方式我明白发生了什么。
从概念上讲我想知道
- 为什么打开 TTY 设备(而不是使用 stdin/stdout)
- 如果我打开一个 TTY 设备,我是否必须首先找出当前的 tty(例如,通过打开一个管道
/usr/bin/tty
,然后打开该设备)。
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void) {
int tty_fd = open("/dev/tty", O_RDWR);
if (tty_fd < 0) {
printf("Cannot open /devv/tty: errno = %d, %s\r\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
write(tty_fd, "\x1B[6n\n", 5);
unsigned char res[16] = {0};
size_t j = 0;
for (j = 0; j < sizeof(res) - 1 && read(tty_fd, res + j, 1) == 1; j++) {
printf("%d\n", res[j]);
if (res[j] == 'R') {
break;
res[j] = '\0';
}
}
printf("Answerback = %s", res + 1);
return 0;
}
答案1
打开和使用
/dev/tty
可确保进程有一个控制终端,而这就是转义码实际所在的位置。写入标准输出和从标准输入读取会受到任何重定向(如果有)的影响。事实上,运行示例程序并将其输出重定向到文件将导致输出进入该文件,但从终端读取光标位置(如果有的话)。
/dev/tty
始终是当前进程的控制终端(如果有的话)。看我当前的控制终端和`/dev/tty`之间有什么关系?了解详情。/dev/tty
这本身就提供了,这里不需要一定程度的间接。