让PyRun_InteractiveLoop()从/向Linux上的另一个pty接收输入/输出

时间:2013-03-17 13:54:38

标签: python linux pty

在C程序中,我想运行一个Python交互式循环,它接受来自输入并输出到伪终端(例如pts / 4)不同于启动C程序的伪终端(例如pts / 1)。

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

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并且不能使用dup'ed fds。

理想情况下,我们希望交互式循环不依赖于fds 0 1 2,并且可以在/ dev / pts / 4上运行,如下所示:

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

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

所以问题是双重的:

  • 如果PyRun_InteractiveLoop()只能在stdin / fds 0 1 2上运行,为什么它会接受任何参数呢?
  • 如果它实际上可以在除了stdin / fds 0 1 2之外的其他东西上工作,特别是在用户定义的伪终端上,应该怎么调用呢?

0 个答案:

没有答案