16

名前付きパイプを使用して、別のプログラム (MATLAB) 内の外部プログラム (wgrib2) の出力をキャプチャしています。MATLAB コードは以下のとおりでsystem()、コマンド ラインにアクセスしてパイプを作成します。

system('mkfifo myfifo');     % Make a named pipe myfifo
% Call the external program wgrib2 and dump its output to the named pipe myfifo
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &');
fid = fopen('myfifo', 'r');  % Open the named pipe
a = fscanf(fid, '%c');       % Read the output as character
fclose(fid);                 % Close the "file" (myfifo still exists afterward)

ここに私の質問があります:

  1. myfifo使用後に名前付きパイプを閉じる必要はありますか? コードの実行後も持続するようです。
  2. myfifo閉じる必要がある場合、閉じるコマンドは何ですか?
  3. 上記のコードサンプルを何度も(>1000)実行するので、名前付きパイプを再利用して最後まで閉じなくても大丈夫ですか?
4

4 に答える 4

11
  1. いいえ、Unix はすべてをファイルのように扱います。名前付きパイプも同じです。使い終わったら、マシンが名前付きパイプでごちゃごちゃにならないように閉じたいと思うかもしれませんが、閉じる必要はありません。

以下のコメントを反映するように編集されましたが、これは正しいです。削除 != クローズ。

  1. ファイルを閉じるのと同じ方法で名前付きパイプを閉じます。
    fclose(mFifo)

受け入れられた回答で述べたように、閉じても fifo は削除されません。個別に行う必要がある場合があります。

  1. 名前付きパイプを再利用しても問題はありません。ただし、反復ごとに読み取り/書き込みがいつ終了するかを知るのはあなた次第です。すべてのデータがパイプから読み取られたら、何度でも自由に使用できます。
于 2013-02-01T15:04:15.230 に答える
1

おそらく、MATLAB でシステム出力をキャプチャするために名前付きパイプを使用するべきではありません。MATLABsystem()ドキュメントに従って、system()呼び出しで直接出力をキャプチャできます。

[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166');
a = cmdout

ただし、名前付きパイプの使用を主張する場合は、はい、それを閉じる必要があります。開いているリソースは常に閉じる必要があります。ただし、名前付きパイプを閉じても削除されませ ん。

于 2017-03-15T15:58:22.020 に答える
0

同意できません。fifo を閉じることで閉じます。fifo が終了すると、システムは fifo を閉じます (上記の system() 呼び出し)。fifo が閉じられると、もう一方の側はデータがなくなったことを認識し (EOF 条件、コード例では明示的な EOF チェックはありませんが、実際のコードでは非常に可能性が高い)、終了します。

于 2016-07-28T02:51:41.693 に答える