Potok trzech i więcej procesów

0

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.

0

Oczywiście zapomniałem dodać: Linux 64-bit + gcc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1