パイプは標準入力にどのような影響を与えますか?

パイプは標準入力にどのような影響を与えますか?

Cプログラムを作成したいのですが、解析する必要がありますstdin。入力すると、cat file.txt | grep -v matchfromはどのように解析されますか?シリーズですか? 2つの異なる文字列ですか?私は走り、そこで(見かけ上)便利なものを見つけることができませんでした。stdoutcat-v matchcat /dev/pts/0file /dev/pts/0

答え1

管路読み取りおよび書き込み側に関連するファイル記述子を含むカーネルに割り当てられたバッファー。実行時cat file.txt | grep -v match

  • シェルはパイプを生成します(pipe()システムコールを使用して)
  • シェルfork()S. サブプロセスはdup2()システムコールを使用して標準出力ストリームを閉じ、パイプの書き込み端を標準出力にコピーします。 (その後、標準出力への書き込みはカーネルバッファに移動します。)その後、子プロセスは更新された標準出力を持ちexec()ます。cat
  • シェルがfork()再び表示されます。サブプロセスはdup2()システムコールを使用して標準入力ストリームを閉じ、パイプの読み出し端を標準入力にコピーします。 (以降、標準入力の読み取りはカーネルバッファで行われます。)その後、サブプロセスは標準入力を更新しましたexec()grep

現在、および両方がcat実行されていますgrepgrep標準入力(パイプ)から読み取ろうとし、パイプが空の場合、読み取りはブロックされます。cat標準出力(再パイプ)に書き込もうとし、パイプがいっぱいになると書き込みがブロックされます。それ以外の場合は、catバッファに書き込むときにgrepバッファから読み取ることができます。

答え2

Cプログラムの主な機能の標準定義は次のとおりです。

int main(int argc, char *argv[])

ここではargc、この場合はforargvのコマンドライン引数です。参考にしてください-vmatchgrepいいえ単一の文字列ですが、シェルは引数を別の文字列(\0Cでは通常NUL /終了)に分割しました。argcパラメータの数とargvパラメータ自体が含まれます。

一方、標準入力は1つだけで、すべての機能FILE *で直接使用できます。など。stdiofgets(buf, sizeof(buf), stdin)


私はあなたがそれをどこで得たのかわかりませんcat /dev/pts/0。特定の疑似端末から読み取られ、同じ端末のシェルから読み取られたものと競合する可能性があります。 (2つの端末、xterm、SSHセッション、画面などを開きます。次に最初の端末で実行すると、端末名がtty表示されます(例)/dev/pts/123cat /dev/pts/123見てください。

関連情報