質問

ベン・ヴォイトの答えをコードに組み込んだ後、それは機能しているようです

元の質問:

私はdup2を使用しようとしています:

  1. 「ls -al」の出力を「grep foo」への入力として渡します。
  2. その出力は「Grep Bar」の入力になります。
  3. 最終的に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回呼び出す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top