После этого SO вопрос и ответ
Соединение n команд с каналами в оболочке?
Я попытался выполнить yes | head
, но он работает в бесконечном цикле или никогда не отвечает. В чем проблема.
Я внес некоторые изменения, и вот рабочий код
#include <unistd.h>
struct command
{
const char **string;
};
Вспомогательная функция
pid_t start(command* command, pid_t pid, int* status, int in, int out) {
(void) pid;
pid_t cpid;
int childInt;
cpid = fork();
if (cpid == 0) {
if (in != 0)
{
dup2(in, 0);
close(in);
}
if (out != 1)
{
dup2(out, 1);
close(out);
}
execvp(c->string[0], c->string);
_exit(1);
}
waitpid(cpid, &childInt, 0);
}
*status = childInt;
return c->pid;
}
и в моей основной функции
for(int i = 0; i < n; i++)
//New command every loop
int p = pipe(fd);
if (p == 0)
{
start_command(c, 0, &status, in, fd[1]);
close(fd[1]);
in = fd[0];
}
continue;
}
dup2(in, 0);
yes
и ждете её завершения (чего никогда не происходит, так как вы держите другой конец труба открыта)... и даже не доходит до выполненияhead
- person Antti Haapala   schedule 23.03.2019