C++ (主に C) でシミュレートされたファイル システムにパイピングを実装しています。ホストシェルでコマンドを実行する必要がありますが、シミュレートされたファイルシステムでパイプ自体を実行します。
pipe()
、fork()
、およびsystem()
システム コールを使用してこれを実現できますが、 popen()
(パイプの作成、プロセスのフォーク、シェルへのコマンドの受け渡しを処理する) を使用することをお勧めします。パイプの親プロセスから書き込み、子プロセス側で読み取り、子から出力を書き戻し、最後に親からその出力を読み取る必要があるため、これは不可能かもしれません。私のシステムの man ページにpopen()
は、双方向パイプが可能であると書かれていますが、私のコードは、単方向パイプのみをサポートする古いバージョンのシステムで実行する必要があります。
上記の個別の呼び出しを使用して、パイプを開閉してこれを実現できます。それは可能popen()
ですか?
些細な例として、実行するls -l | grep .txt | grep cmds
には次のことを行う必要があります。
ls -l
ホスト上で実行するパイプとプロセスを開きます。その出力を読み返すls -l
の出力をシミュレーターにパイプで戻します- パイプとプロセスを開き、パイプさ
grep .txt
れた出力でホスト上で実行しますls -l
- この出力をシミュレーターにパイプで戻します (ここで立ち往生)
- パイプとプロセスを開き、パイプさ
grep cmds
れた出力でホスト上で実行しますgrep .txt
- この出力をシミュレーターに戻して出力します
マン・ポペン
Mac OS X の場合:
関数は
popen()
、双方向パイプを作成し、フォークし、シェルを呼び出すことによって、プロセスを「開きます」。親プロセスの以前の呼び出しによって開かれたストリームpopen()
は、新しい子プロセスで閉じられます。歴史的にpopen()
、単方向パイプで実装されていました。したがって、 の多くの実装ではpopen()
、 mode 引数のみで読み取りまたは書き込みを指定できますが、両方は指定できません。は双方向パイプを使用して実装されるようになったためpopen()
、mode 引数は双方向データ フローを要求する場合があります。mode 引数はヌル終了文字列へのポインタで、読み取りの場合は 'r'、書き込みの場合は 'w'、読み取りと書き込みの場合は 'r+' でなければなりません。