プロセスの出力を別のものにパイプラインするunixパイプ(|)と、プロセス間通信に使用するcの "pipe(int pipefd [2])"を使用して作成したパイプは同じですか?Unixパイプ(|)とpipe(int pipefd [2])を使って作成したパイプは同じですか?
8
A
答えて
5
これらは、シェルの|
と同等の機能を実装するには十分ではありません。pipe(2)
の呼び出しでは全く同じではありません。
pipe(2)
は、2つのファイル記述子(読み取り終了と書き込み終了)を作成します。しかし、|
の機能を実装するにはそれ以上のことが必要です。パイプを作成する
典型的な配列は、このように書きます:
1)pipe(2)
を使用して読んで終了し、書き込み終了を作成します。
2)fork()
を使用して子プロセスを作成します。
3)親プロセスと子プロセスは、dup2()
を使用してファイル記述子を複製します。
4)どちらのプロセスも、それぞれパイプの一端(各プロセスが使用しないパイプの一端)を閉じます。
5)1つはパイプに書き込み、もう1つはパイプから読み取ります。
これを示す簡単な例を考えてみましょう。この場合、引数としてファイル名を渡し、親プロセスは子によってcat
というファイルをgrepsします。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int pipefd[2];
int pid;
char *cat_args[] = {"cat", argv[1], NULL};
char *grep_args[] = {"grep", "search_word", NULL};
pipe(pipefd);
pid = fork();
if (pid != 0)
{
dup2(pipefd[0], 0);
close(pipefd[1]);
execvp("grep", grep_args);
}
else
{
dup2(pipefd[1], 1);
close(pipefd[0]);
execvp("cat", cat_args);
}
}
これはシェル上
cat file | grep search_word
を行うことと等価です。
6
0
pipe(2)
システムコールは、シェルの実装であり、それはintenally pipe()
システムコールを使用します。
関連する問題
- 1. pipe()を使用して作成されたパイプを双方向パイプとして使用できないのはなぜですか?
- 2. linuxでpipe()を使ってパイプをつなぎ合わせたもの
- 3. UNIXパイプ質問
- 4. 私はパイプの端の1つを閉じなかった、何か間違いが起こったか?
- 5. gdbでUnixパイプをデバッグ
- 6. C UNIXシェルのパイプ
- 7. パイプとフォークのトラブル
- 8. パイプUnixが、私はこのUnixコマンドをシミュレートしたいC
- 9. 名前付きパイプを使って 'ループ'を作成する
- 10. UNIXのパイプでディレクトリを変更する
- 11. 角度2のコンポーネントからパイプを作成して呼び出す方法は?
- 12. C#/ Tamir.SharpSsh:System.IO.IOException:パイプが閉じた
- 13. C#とFfmpegの間にパイプを作成
- 14. UNIXのpipe&dup関数
- 15. パイプを使ったプロセス間通信
- 16. 名前付きパイプをログファイルとして使用してパイプを削除して再作成すると、nginxはどうなりますか?
- 17. 同じパイプ上で動作するストリームのためのRessource処理
- 18. 角度2日はパイプ日
- 19. フォーク後にパイプを作成する
- 20. シェル作成パイプをリダイレクトする方法
- 21. ctrl + Cでパイプを閉じるには?
- 22. dplyrパイプ(%>%)を同等の非パイプ式より遅く使用するのはなぜですか?
- 23. パイプで作業する
- 24. は、名前付きパイプを読むと、私はここでは、名前付きパイプを使用する2つの簡単なプログラムを持っているループ
- 25. はjavaのlinux pipeと同じ操作を実行しますか?
- 26. 角度2のコードでパイプを使用できますか?
- 27. どのようにクロスプラットフォームのポートunixパイプですか?
- 28. 同じマシンで2つの名前付きパイプを開くにはどうすればいいですか?
- 29. cPanelとPHPを使った電子メールのパイプ
- 30. 2番目のセクションのサイクルでパイプを作る方法は?
なぜ重複が作成されますか?私たちは複製せずにデータを書き込んだり読み込んだりできませんか? –
すべての親子プロセス通信で厳密には必要ない( 'dup2()')。あなたは親と子が直接コミュニケーションをとることができます。たとえば、親は 'write(2)'をパイプの書き込み側に、子は 'read(2)'を読み込み側から読み込むことができます。 –
@PsAkshay実行されたgrepとcatはpipefdのものではなく、0と1からのみ読み書きできます。 –