Я пытаюсь реализовать несколько каналов в C для запуска нескольких команд, таких как оболочка. Я сделал связанный список (называемый в моем коде t_launch), который выглядит так, если вы наберете «ls | grep src | wc»:
wc -- PIPE -- grep src -- PIPE -- ls
Каждый узел PIPE содержит int tab[2] из функции pipe() (конечно, для каждого узла PIPE был один вызов pipe())
Теперь я пытаюсь выполнить эти команды:
int execute_launch_list(t_shell *shell, t_launch *launchs)
{
pid_t pid;
int status;
int firstpid;
firstpid = 0;
while (launchs != NULL)
{
if ((pid = fork()) == -1)
return (my_error("Unable to fork\n"));
if (pid == 0)
{
if (launchs->prev != NULL)
{
close(1);
dup2(launchs->prev->pipefd[1], 1);
close(launchs->prev->pipefd[0]);
}
if (launchs->next != NULL)
{
close(0);
dup2(launchs->next->pipefd[0], 0);
close(launchs->next->pipefd[1]);
}
execve(launchs->cmdpath, launchs->words, shell->environ);
}
else if (firstpid == 0)
firstpid = pid;
launchs = launchs->next == NULL ? launchs->next : launchs->next->next;
}
waitpid(firstpid, &status, 0);
return (SUCCESS);
}
Но это не работает: похоже, что команды не перестают читать. Например, если я наберу «ls | grep src», «src» будет напечатан из команды grep, но grep продолжит чтение и никогда не остановится. Если я наберу «ls | grep источник | wc", ничего не печатается. Что не так с моим кодом? Спасибо.
launchs = launchs->next == NULL ? launchs->next : launchs->next->next;
, пожалуйста? Я пропустил sonethin или вы пропускаете каждый второй дочерний процесс? - person Ingo Leonhardt   schedule 11.07.2013stdin
отlaunch->prev
и перенаправитьstdout
наlaunchs->next
. ... упс, его комментарий удалили, но тем не менее... - person Ingo Leonhardt   schedule 11.07.2013