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