5

在一个 C 程序中,我想运行一个 Python 交互式循环,该循环从一个伪终端(例如 pts/4)获取输入并将其输出到与启动 C 程序的终端(例如 pts/1)不同的伪终端(例如 pts/4) .

运行交互式循环的基本方法是:

PyRun_InteractiveLoop(stdin, "<stdin>");

然而,这并不能解决问题,因为它使用的是启动程序的伪终端 (pts/1),而不是 pts/4。

一个有效的解决方案是:

int fd = open("/dev/pts/4", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
PyRun_InteractiveLoop(stdin, "<stdin>");

此解决方案的缺点是它使文件描述符 0 1 2 无法与启动程序的伪终端进行通信。虽然这些描述符可以事先复制,但有些函数坚持使用 0 1 2 并且不能使用复制的 fds。

理想情况下,我们希望交互式循环不依赖 fds 0 1 2,并像这样在 /dev/pts/4 上运行:

FILE *pts = fopen("/dev/pts/4", "rw");
PyRun_InteractiveLoop(pts, "/dev/pts/4");

不幸的是,这并没有按预期工作,并且与使用标准输入具有相同的效果,标准输入默认使用启动程序的伪终端。

所以问题是双重的:

  • 如果 PyRun_InteractiveLoop() 只能在 stdin / fds 0 1 2 上运行,为什么它根本不需要任何参数?
  • 如果它实际上可以在 stdin / fds 0 1 2 以外的其他东西上工作,特别是在用户定义的伪终端上,应该如何调用它来做到这一点?
4

0 回答 0