Я пытаюсь построить мини-оболочку, и у меня почти все работает, кроме труб. Я прочитал много ответов на этом и многих других сайтах, но я не могу найти свою конкретную проблему.
Последовательность должна завершиться, когда закончится самый правый процесс, это: sleep 3 | sleep 3 | sleep 0
должен немедленно завершиться и не ждать ни одного из процессов сна 3.
* argvv - указатель на первый процесс (* argvv будет sleep 3
, * (argvv + 1) следующий sleep 3
, et c. Я не знаю, что происходит, но что-то не так с файловыми дескрипторами, и все ломается после теста.
Например, если на входе sh> ls | wc | wc
, на выходе - это
sh> ls | wc | wc
sh> 1 3 25
, затем он ожидает ввода. Пока я снова не нажму Enter, он завершится. После этого sleep 3
больше не работает.
Любая помощь будет приветствоваться , большое спасибо!
Изменить:
Хорошо, я отредактировал код, и все работает нормально, кроме сна 3 | сна 0 длится 3 секунды, а не немедленно заканчивается. Я не знаю, как это исправить.
void execute(char ***argvv)
{
pid_t pid;
int pd[2];
int in = 0;
while (*argvv != NULL) {
pipe(pd);
if ((pid = fork()) < 0)
{
perror();
exit(1);
}
else if (pid == 0) {
dup2(in, 0);
if (*(argvv + 1) != NULL)
dup2(pf[1], 1);
close(pd[0]);
close(pd[1]);
execvp((*argvv)[0], *argvv);
perror();
exit(1);
}
else
{
close(pd[1]);
in = pd[0];
if (*(argvv + 1) == NULL)
close(pd[0]);
argvv++;
}
wait(&pid);
}
}