質問
ベン・ヴォイトの答えをコードに組み込んだ後、それは機能しているようです
元の質問:
私はdup2を使用しようとしています:
- 「ls -al」の出力を「grep foo」への入力として渡します。
- その出力は「Grep Bar」の入力になります。
- 最終的にstdoutに出力されます。
最終出力は(空白)、「in」ファイルは(空白)、「out」のファイルの出力が「ls -al」の出力を持っています。
何が起こっているのかという考えはありますか?
int main()
{
pid_t pid;
int i;
int inFileDes,outFileDes;
inFileDes=open("in",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
outFileDes=open("out",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);
for(i=0;i<3;i++)
{
if((pid=fork())==0)
{
switch(i)
{
case 0:
dup2(outFileDes,1);
execl("/bin/ls","ls","-al",0);
break;
case 1:
// originally:
dup2(outFileDes,0); // dup2(outFileDes,1);
dup2(inFileDes,1); // dup2(inFileDes,0);
execl("/bin/grep","grep","foo",0); //lines having foo
break;
case 2:
dup2(inFileDes,0);
execl("/bin/grep","grep","bar",0); //lines having foo & bar
break;
}
exit(-1); //in error
}
waitpid(pid,NULL,0);
}
close(inFileDes);
close(outFileDes);
return(0);
}
解決
あなたの open
呼び出しは「in」の空のファイルを作成すると、プログラムが書いていないため、それが予想されます。の両方のインスタンスから grep
空のファイルから読むと、出力も空です。
あなたが本当に欲しいのは、それを使うことです pipe
一対のハンドルを取得する機能。これは、1つのプログラムであると書かれ、次のプログラムから読み取ります。子プロセス間に2セットの接続があるため、2回呼び出す必要があります。
所属していません StackOverflow