You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C语言实现的终端文本编辑器从指定第二终端接收输入

问题核心原因

你目前的代码有两个核心问题导致无法接收第二个终端的输入:

  1. 打开目标终端设备时仅使用了"w"只写模式,没有读权限,无法读取该终端的输入事件
  2. 你注释了UI_INPUT_FILENO = UI_OUTPUT_FILENO;这行代码,程序的输入源仍然绑定在启动程序的原终端上

修改步骤

  1. 将目标TTY的打开模式从只写改为读写模式"r+"
  2. 取消UI_INPUT_FILENO = UI_OUTPUT_FILENO;的注释,将输入输出都绑定到目标终端
  3. 提前将目标终端的默认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;
}

运行操作步骤

  1. 打开两个终端:
    • 终端A为日志终端,用来启动程序、打印日志
    • 终端B为编辑器界面终端,用来展示编辑器、接收输入
  2. 在终端B中执行命令tty查看其设备路径,比如返回/dev/pts/2,然后在终端B执行sleep 36000,阻塞该终端的默认shell,避免抢输入
  3. 在终端A中编译程序,执行./a.out -tty /dev/pts/2(替换为你自己的终端B路径)
  4. 此时在终端B输入的内容会直接显示在编辑器界面,按Ctrl+q即可退出程序,终端A会打印窗口行列信息

内容的提问来源于stack exchange,提问作者Max888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:54:03