如何让C语言实现的终端文本编辑器从指定第二终端接收输入
问题核心原因
你目前的代码有两个核心问题导致无法接收第二个终端的输入:
- 打开目标终端设备时仅使用了
"w"只写模式,没有读权限,无法读取该终端的输入事件 - 你注释了
UI_INPUT_FILENO = UI_OUTPUT_FILENO;这行代码,程序的输入源仍然绑定在启动程序的原终端上
修改步骤
- 将目标TTY的打开模式从只写改为读写模式
"r+" - 取消
UI_INPUT_FILENO = UI_OUTPUT_FILENO;的注释,将输入输出都绑定到目标终端 - 提前将目标终端的默认shell阻塞,避免两个进程同时抢该终端的输入
修改后的核心代码片段
int main(int argc, char **argv) { FILE *lfp = NULL; for (int a = 1; a < argc; a++) { if (strcmp(argv[a], "-tty") == 0) { // 改w为r+,支持读写目标终端 lfp = fopen(argv[a + 1], "r+"); UI_OUTPUT_FILENO = fileno(lfp); // 取消这行的注释,输入源也绑定到目标终端 UI_INPUT_FILENO = UI_OUTPUT_FILENO; } } enable_raw_mode(); write(UI_OUTPUT_FILENO, ENTER_ALT_SCREEN, 8); write(UI_OUTPUT_FILENO, MOVE_CURSOR_HOME, 3); int nrows, ncols; if (getWindowSize(&nrows, &ncols) == -1) return EXIT_FAILURE; // 日志仍然输出到原终端 printf("rows: %d, cols: %d\n", nrows, ncols); char seq[10] = {0}; while (read(UI_INPUT_FILENO, &seq, 10) != 0) { if (seq[0] == CTRL_KEY('q')) { break; } else if (strlen(seq) == 1) { write(UI_OUTPUT_FILENO, seq, 1); } memset(seq, 0, sizeof(seq)); } // 等退出逻辑执行完再关闭lfp,避免退出alt screen的序列无法写入 if (lfp) fclose(lfp); return 0; }
运行操作步骤
- 打开两个终端:
- 终端A为日志终端,用来启动程序、打印日志
- 终端B为编辑器界面终端,用来展示编辑器、接收输入
- 在终端B中执行命令
tty查看其设备路径,比如返回/dev/pts/2,然后在终端B执行sleep 36000,阻塞该终端的默认shell,避免抢输入 - 在终端A中编译程序,执行
./a.out -tty /dev/pts/2(替换为你自己的终端B路径) - 此时在终端B输入的内容会直接显示在编辑器界面,按
Ctrl+q即可退出程序,终端A会打印窗口行列信息
内容的提问来源于stack exchange,提问作者Max888
相关产品推荐
相关产品推荐

