Вопрос
После включения ответа Бена Фуигта в код, похоже, работает
Оригинальный вопрос:
Я пытаюсь использовать DUP2 для:
- Передайте выход «ls -al» в качестве входного в «grep foo»,
- чей вывод становится входом для «Греповой панели»,
- который, наконец, выводит в Stdout.
Окончательный вывод (пустой), файл «в» IS (Blank) и файл «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
Call создает пустой файл «в», и ни одна из программ не пишет его, так что это ожидается. Поскольку оба случая grep
Читать из пустого файла, их вывод также пуст.
Вы действительно хотите использовать pipe
Функция, чтобы получить пару ручек, которые написаны как одна программа, и прочитав из -за следующей. Вам нужно будет позвонить дважды, потому что у вас есть два набора соединений между дочерними процессами.
Не связан с StackOverflow