C double fork

Автор alexxnight, 14 ноября 2019, 23:28:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

alexxnight

Добрый день.
Изучаю на С double fork совместно с pipe. Что-то типа реализации канала  |  без участия оболочки.
Как пример, команда: ps a | cat
Видел реализацию с последовательными fork()
Я сделал параллельный вариант.
Где тут может быть косяк?
Кто этим занимался, озадачивался, расскажите, какие могут быть подводные камни.
Спасибо.


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

int main ( int argc, char** argv )
{
    int pipes[2];
    pid_t pid_c1, pid_c2;

    if ( ! pipe(pipes) )
    {
        // Parent
        if ( (pid_c1 = fork()) &&  (pid_c2 = fork()) )
        {
            printf ("Parent. \t pid %i \t getppid = %i \t pid_c1 = %i \t pid_c2 = %i\n", getpid(), getppid(), pid_c1, pid_c2);
            if ( pid_c2 == -1 || pid_c1 == -1)
                exit(EXIT_FAILURE);

            if ( waitpid(pid_c1, NULL, WNOHANG) == -1)
                printf("ERROR waitpid c1");
            if ( waitpid(pid_c2, NULL, WNOHANG) == -1)
                printf("ERROR waitpid c2");
        }
        // Child 1
        if ( ! pid_c1 )
        {
            printf ("First child. \t pid_c1 = %i \t pid_c2 = %i \t getpid = %i \t getppid = %i\n", pid_c1, pid_c2, getpid(), getppid());
            close(1);
            dup(pipes[1]);
            close(pipes[0]);
            close(pipes[1]);
            execlp("ps", "ps", "a", 0);
            exit(EXIT_FAILURE);
        }
        // Child 2
        if ( ! pid_c2 )
        {
            printf ("Second child. \t pid_c1 = %i \t pid_c2 = %i \t getpid = %i \t getppid = %i\n", pid_c1, pid_c2, getpid(), getppid());
            close(0);
            dup(pipes[0]);
            close(pipes[0]);
            close(pipes[1]);
            execlp("cat", "cat", 0);
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}