Используя fork
, я создал дочерний элемент, и в нем я выполняю команду ls
, используя execl
. Чтобы отправить вывод родителю, я использовал pipe
и dup
. Затем родитель печатает вывод. Код дает ожидаемый результат, но когда я попытался восстановить обратно stdout
, который я изначально сохранил в stdout_holder
, на терминале ничего не печатается (когда я использовал printf("hello") или оператор execl под ним). Однако после нескольких наблюдений было замечено, что hello
печатается только тогда, когда ничего не делается после перенаправления "1" в первый раз. (Если я ничего не делаю после dup(fd[1],1)
и просто делаю dup(stdout_holder,1)
) Почему это происходит?
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>
int main()
{int fd[2],stdout_holder;
char str;
pid_t pid;
pipe(fd);
pid=fork();
if(pid==0)
{ stdout_holder=dup(1);
close(fd[0]);
printf("stdout_holder=%d\n",stdout_holder);
fd[1]=dup2(fd[1],1);
execl("/bin/ls","ls","-l",NULL);
stdout_holder=dup2(stdout_holder,1);
printf("hello\n"); //Terminal doesnt show output.
execl("/bin/ls","ls","-l",NULL); //Terminal doesnt show output
}
else
{ close(fd[1]);
wait(&pid);
while(read(fd[0],&str,1)>0)
printf("%c",str);
}
}