Cプログラムで、Cプログラムが起動されたもの(pts/1など)とは異なる疑似端末(pts/4など)から入力を取得して出力するPythonインタラクティブループを実行したい.
対話型ループを実行する基本的な方法は次のとおりです。
PyRun_InteractiveLoop(stdin, "<stdin>");
ただし、pts/4 ではなく、プログラムを起動した疑似端末 (pts/1) を使用するため、これは問題を解決しません。
機能するソリューションは次のとおりです。
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");
残念ながら、これは期待どおりには機能せず、デフォルトでプログラムが起動された疑似端末を使用する stdin を使用するのと同じ効果があります。
したがって、質問は 2 つあります。
- PyRun_InteractiveLoop() が stdin / fds 0 1 2 でしか実行できない場合、なぜ引数を取る必要があるのでしょうか?
- stdin / fds 0 1 2 以外、特にユーザー定義の疑似端末で実際に機能する場合、それを行うにはどのように呼び出す必要がありますか?