7

R のpipe()関数を使用してシェル コマンドからの出力をキャプチャしていますが、コマンドから終了コードも取得したいと考えています。

ここで使用できることはわかっていsystem2ますが、パイプの利点、つまりストリーミング方式で出力を処理する機能が必要です。

が終了ステータスを返すという事実を利用するために、popen()およびC 関数をラップする独自のライブラリを作成することを検討していますが、これは回避できる可能性があります。pclose()pclose()

助言がありますか?ありがとう!

ノート

一時ファイルや名前付きパイプなどを使用してこれを行う方法は確かにありますが、理想的にはこれらの回避策を避けたいと思います。R->C 関数を含む共有ライブラリをコンパイルする気はありますが (R ソース コードの一部をコピー アンド ペーストすることも考えています)、R を再構築する気はありません。

アップデート

R のソース コードを読み始めたところ、チェックされていない pclose 呼び出しが見つかりました。

src/main/connections.c:

static void pipe_close(Rconnection con)
{
    pclose(((Rfileconn)(con->private))->fp);
    con->isopen = FALSE;
}

R_pcloseRコードを複製するclose()が、この戻り値を保存するC関数を実装するアプローチを進めてみました。残念ながら、この静的変数に遭遇しましたsrc/main/connections.c

static Rconnection Connections[NCONNECTIONS];

変数にアクセスするにはとにかく実行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.soする必要があるため、pclose の戻り値を取得するために独自のパッチを使用して R を再構築するのが最善の解決策のようです。

4

1 に答える 1

1

醜いハック: コマンド呼び出しを小さなシェル スクリプトにラップして、その子の終了コードを一時ファイルに書き込むことができます。したがって、ストリームが終了したら、そのファイルのサイズがゼロ以外になるまで待ってから、そこからステータスを読み取ることができます。誰かがより良い解決策を考え出すことを願っていますが、少なくともこれは一種の解決策です。

于 2012-10-25T20:43:51.743 に答える