Cプログラムを作成したいのですが、解析する必要がありますstdin
。入力すると、cat file.txt | grep -v match
fromはどのように解析されますか?シリーズですか? 2つの異なる文字列ですか?私は走り、そこで(見かけ上)便利なものを見つけることができませんでした。stdout
cat
-v match
cat /dev/pts/0
file /dev/pts/0
答え1
ㅏ管路読み取りおよび書き込み側に関連するファイル記述子を含むカーネルに割り当てられたバッファー。実行時cat file.txt | grep -v match
:
- シェルはパイプを生成します(
pipe()
システムコールを使用して) - シェル
fork()
S. サブプロセスはdup2()
システムコールを使用して標準出力ストリームを閉じ、パイプの書き込み端を標準出力にコピーします。 (その後、標準出力への書き込みはカーネルバッファに移動します。)その後、子プロセスは更新された標準出力を持ちexec()
ます。cat
- シェルが
fork()
再び表示されます。サブプロセスはdup2()
システムコールを使用して標準入力ストリームを閉じ、パイプの読み出し端を標準入力にコピーします。 (以降、標準入力の読み取りはカーネルバッファで行われます。)その後、サブプロセスは標準入力を更新しましたexec()
。grep
現在、および両方がcat
実行されていますgrep
。grep
標準入力(パイプ)から読み取ろうとし、パイプが空の場合、読み取りはブロックされます。cat
標準出力(再パイプ)に書き込もうとし、パイプがいっぱいになると書き込みがブロックされます。それ以外の場合は、cat
バッファに書き込むときにgrep
バッファから読み取ることができます。
答え2
Cプログラムの主な機能の標準定義は次のとおりです。
int main(int argc, char *argv[])
ここではargc
、この場合はforargv
のコマンドライン引数です。参考にしてください-v
match
grep
いいえ単一の文字列ですが、シェルは引数を別の文字列(\0
Cでは通常NUL /終了)に分割しました。argc
パラメータの数とargv
パラメータ自体が含まれます。
一方、標準入力は1つだけで、すべての機能FILE *
で直接使用できます。など。stdio
fgets(buf, sizeof(buf), stdin)
私はあなたがそれをどこで得たのかわかりませんcat /dev/pts/0
。特定の疑似端末から読み取られ、同じ端末のシェルから読み取られたものと競合する可能性があります。 (2つの端末、xterm、SSHセッション、画面などを開きます。次に最初の端末で実行すると、端末名がtty
表示されます(例)/dev/pts/123
。cat /dev/pts/123
見てください。