5

自分で疑似シェルを書きたいのですが、きれいな色などを取得したいのですが、サブプロセスをだましてTTYにあると思わせるにはどうすればよいですか。仮想TTYについて読んだことがありますが、仮想TTYを作成する方法や、サブプロセスに仮想TTYを認識させる方法についての実用的な情報はあまり見つかりませんでしたisatty(stdout) == 1

4

1 に答える 1

8

探しているものは、疑似端末、疑似 tty、または pty と呼ばれます。これらはマスター/スレーブのペアで存在し、ソケットのペアと同様に動作します (パイプの双方向バージョン。一方の端に書き込まれたものはもう一方の端で読み取ることができます)。制御プロセスではposix_openpt、マスターを開き、ptsnameスレーブの名前を取得するために使用します (おそらく/dev/pts/X):

int master = posix_openpt(O_RDWR | O_NOCTTY);
grantpt(master);     /* change ownership and permissions */
unlockpt(master);    /* must be called before obtaining slave */
int slave = open(ptsname(master), O_RDWR | O_NOCTTY);

いつものように、各関数は失敗する可能性があるため、エラー チェックを追加します。slavefd はスレーブ デバイスを参照するようになりました。子プロセスで使用dup2(slave, STDOUT_FILENO)して、標準出力をスレーブ疑似端末に設定します。stdin と stderr についても同様です。

(一部の Linux マンページposix_openptでは、 が を返すと誤って記載されていることに注意してくださいchar *。また、一連の関数に混乱しないでくださいopenpty。これらは、推奨されない疑似 tty への古いインターフェイスを表しています。)

于 2010-11-08T12:05:40.303 に答える