Автор Тема: C double fork  (Прочитано 178 раз)

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

Оффлайн alexxnight

  • Активный пользователь
  • **
  • Topic Author
  • Сообщений: 83
C double fork
« : 14 Ноябрь 2019, 23:28:51 »
Добрый день.
Изучаю на С 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;
}
« Последнее редактирование: 14 Ноябрь 2019, 23:38:17 от alexxnight »
 

Теги: c fork pipe 
 

Реализация fork на shell-скриптах?

Автор epros

Ответов: 5
Просмотров: 3319
Последний ответ 26 Ноябрь 2013, 16:05:42
от yura_n