1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
int var;
void exec_cmd(t_binary *tree, t_execinf *info)
{
t_execvar exe;
if (tree && tree->flag != PIPE_F)
xexecve(tree, info);
else if (!tree || pipe(exe.p) == -1 || (exe.pid = fork()) == -1)
exit(EXIT_FAILURE);
if (!exe.pid)
{
if (close(exe.p[0]) == -1 || dup2(exe.p[1], STDOUT_FILENO) == -1)
exit(EXIT_FAILURE);
xexecve(tree, info);
}
else
{
if (close(exe.p[1]) == -1 || dup2(exe.p[0], STDIN_FILENO) == -1)
exit(EXIT_FAILURE);
while (exe.pid != (exe.ret = wait4(exe.pid, &var, WNOHANG, NULL)))
if (exe.ret == -1)
exec_cmd(tree->right, info);
if (tree->right && !var)
exec_cmd(tree->right, info);
else
exit(EXIT_FAILURE);
}
} |
Partager