سؤال

بعد دمج إجابة بن فويغت في الكود ، يبدو أنه يعمل

السؤال الأصلي:

أحاول استخدام 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 وظيفة للحصول على زوج من المقابض ، والتي تتم كتابتها لتكون برنامج واحد والقراءة من قبل التالي. ستحتاج إلى تسميتها مرتين لأن لديك مجموعتان من الاتصالات بين عمليات الطفل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top