Napisałem program, który w założeniu ma uruchomić potok kilku procsów. Problem z tym, że działa on tylko w przypadku uruchomienie dwóch procesów, jeśli próbuję uruchomić 3 procesy - program zatrzymuje się.
#include <stdio.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, char const *argv[], const char *envp[])
{
int x, i;
int status;
int maxForks = 3; // ilosc procesow do uruchomienia (max 3, patrz `coms`)
int pipefds[64][2];
char *coms[64][256];
coms[0][0] = "ls";
coms[0][1] = "-l";
// coms[0][2] = "/";
coms[0][2] = NULL;
coms[1][0] = "sort";
coms[1][1] = NULL;
coms[2][0] = "cat";
coms[2][1] = NULL;
i = 0;
while (i < maxForks - 1)
{
if (pipe(pipefds[i]))
{
perror("pipes: pipe");
exit(1);
}
++i;
}
i = 0;
while (i < maxForks)
{
x = fork();
if (x == 0 && i == 0)
{
fprintf(stderr, "Wykonanie left\n");
if (dup2(pipefds[i][1], 1) != 1)
{
perror("pipes: dup2(pipedf[1])");
exit(1);
}
close(pipefds[i][0]);
close(pipefds[i][1]);
}
else if (x == 0 && i < maxForks - 1)
{
fprintf(stderr, "Wykonanie middle\n");
if (dup2(pipefds[i - 1][0], 0) != 0)
{
perror("pipes: dup2(pipefd[0])");
exit(1);
}
if (dup2(pipefds[i][1], 1) != 1)
{
perror("pipes: dup2(pipedf[1])");
exit(1);
}
close(pipefds[i - 1][0]);
// close(pipefds[i - 1][1]);
// close(pipefds[i][0]);
close(pipefds[i][1]);
}
else if (x == 0 && i == maxForks - 1)
{
fprintf(stderr, "Wykonanie right\n");
if (dup2(pipefds[i - 1][0], 0) != 0)
{
perror("pipes: dup2(pipefd[0])");
exit(1);
}
close(pipefds[i - 1][0]);
close(pipefds[i - 1][1]);
}
if (x == 0)
{
fprintf(stderr, "exec\n");
execvpe(coms[i][0], coms[i], envp);
perror("pipes: blad");
exit(1);
}
++i;
}
for (i = 0; i < maxForks - 1; ++i)
{
close(pipefds[i][0]);
close(pipefds[i][1]);
wait(&status);
}
return 0;
}
Tak wygląda wyjście dla trzech procesów:
Wykonanie left
exec
Wykonanie right
exec
Wykonanie middle
exec <-- tutaj freeze (czeka na wejście?)
Dla dwóch procesów wszystko wygląda ok. Zgaduję, że źle robię któryś pipe.
Z góry dzięki za pomoc.