サブプロセス内でPTYのファイル記述子を取得するには?

サブプロセス内でPTYのファイル記述子を取得するには?

https://man7.org/linux/man-pages/man7/pty.7.html

「UNIX 98擬似端末」では動作すると言いますがptsname(その後open)、この関数はファイル記述子を受け入れます。そこに0(STDIN)と1(STDOUT)を入れようとしましたが、「デバイスに不適切なioctl」というエラーメッセージが表示され、失敗しました。 GNOME端末でプログラムを実行します。

私は他のxtermプログラムを書いていません。非同期(非ブロック)非標準低レベルの入出力用のファイル記述子を持っているだけです。

答え1

まあ、私は自分で答えようとしました。

  • 機能フィード、標準記述子を持つ実際のデバイスをtty見つける必要があります。isatty012
  • 実際のttyが見つかると、このttyname関数は端末デバイスへのパスを提供します。
  • それを開くと、openファイル記述子が提供されます。

O_RDONLY宣言(またはそのO_WRONLYいずれか)とフラグO_NONBLOCKによって課された非ブロック動作にもかかわらず、read私のシステム(Debian 12)の関数は、端末デバイスがネイティブモードに切り替わった後でもブロックされます(およびtcgetattr関数を使用)。 )。cfmakerawtcsetattr

ioctlFIONREAD非同期読み取りは、保留中/読み取り可能なバイトを返す+の助けを借りて実装されます。 (また、poll関数を試しましたが、うまくいきますが、私にとってはオーバーヘッドのようです。)

これで、非同期書き込みを実装/テストする方法がわかりません。

関連情報