3

プログラムを実行するためのユーティリティを作成しています。プログラムからバッファリングされていない stdout と stderr をキャプチャする必要があります。する必要がある:

  • stdout と stderr を別々のファイルにキャプチャします。
  • 出力をバッファリングしない (または行バッファリングする) 必要はありません。
  • 実行中のプログラムのソースを変更せずに。

問題は、出力をファイルにパイプするときに、stdout ストリームがライン バッファーではなくブロック バッファーになることです。プログラムがクラッシュした場合、出力はフラッシュされず、空白になります。したがって、バッファリングなしで (または行バッファリングを使用して) stdout をキャプチャする必要があります。

これは pty で実行できると思いますが、私が望むことを正確に実行する例を見つけるのに苦労しています (ほとんどは stderr を無視します)。実際、C で pty の例をまったく見つけたことがあるかどうかはわかりません。ほとんどは、Python の pty および subprocess モジュールのような高レベルのインターフェースを使用します。

誰でも(コードスニペットまたはリンクで)助けてもらえますか? どんな助けでも大歓迎です。

編集:私はそれを解決したと思います。次の 2 つのリンクは非常に役に立ちました。

私のコードはリポジトリとして利用できます:

4

1 に答える 1

2

見るman 7 pty


特に:

Unix 98 疑似端末

未使用の Unix 98 疑似端末マスターは、 を呼び出すことによって開かれ posix_openpt(3)ます。(この関数は、マスター クローン デバイスを開きます /dev/ptmx。 を参照してくださいpts(4)。) プログラム固有の初期化を実行し、 を使用してスレーブ デバイスの所有権と権限を変更し、 を使用しgrantpt(3)てスレーブのロックを解除したunlockpt(3)後、対応するスレーブ デバイスは、名前を渡すことによって開くことができます。ptsname(3)への呼び出しでによって返され open(2)ます。

このようなコードが呼び出す必要があるライブラリ関数の名前がわかったので、次の 2 つの便利なことができます。

  • それらのマニュアルページを調べてください
  • Google の例のコード。検索エンジンでどのキーワードを使用するかを知っているので、例を見つけるのはずっとうまくいくと思います。
于 2009-10-11T19:01:48.097 に答える