Кольцевая топология с использованием труб и fork () в C - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь разработать программу, в которой родительский процесс генерирует случайное число a от 1 до 500, отправляет его первому дочернему элементу, и этот дочерний элемент вычисляет максимальное число между сгенерированным и случайным числом a и отправляет его в следующий ребенок, который делает то же самое, пока не достигнет пятого ребенка.

До сих пор я придумал это, но столкнулся с двумя проблемами: родительский процесс не отправляет число первым; генерируемое случайное число не отличается для каждого дочернего процесса и одинаково при каждом его генерировании.

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

#define CHILDS 5

int biggestInt(int a, int b)
{
    return (a > b) ? a : b;
}

int main()
{
    int p1[2], p2[2];
    int i, b, c, m, p;

    if (pipe(p1) == -1)
    {
        fprintf(stderr, "Pipe1 Failed");
        return -1;
    }

    for (i = 0; i < CHILDS; i++)
    {
        srand(time(0));
        if (pipe(p2) == -1)
        {
            fprintf(stderr, "Pipe1 Failed");
            return -1;
        }

        p = fork();
        if (p == -1)
        {
            printf("Fork Failed\n");
            exit(-1);
        }
        else if (p == 0)
        {
            close(p1[1]);
            close(p2[0]);

            b = rand() % 499 + 1;
            printf("PID: %d ---- NUM: %d ---- i = %d\n", getpid(), b, i);

            read(p1[0], &c, sizeof(int));
            m = biggestInt(b, c);
            write(p2[1], &m, sizeof(m));

            close(p1[0]);
            close(p2[1]);
            exit(m);
        }
        close(p1[0]);
        close(p1[1]);
        p1[0] = p2[0];
        p1[1] = p2[1];
    }

    close(p2[1]);

    srand(time(0));
    b = rand() % 499 + 1;
    printf("PID: %d ---- NUM: %d ---- PARENT\n", getpid(), b);
    write(p1[1], &b, sizeof(b));
    close(p1[1]);

    read(p2[0], &m, sizeof(int));
    close(p2[0]);
    printf("BIGGEST NUMBER: %d\n", m);

    return 0;
}

И это вывод:

PID: 2709 ---- NUM: 267 ---- i = 0
PID: 2710 ---- NUM: 267 ---- i = 1
PID: 2711 ---- NUM: 267 ---- i = 2
PID: 2712 ---- NUM: 267 ---- i = 3
PID: 2708 ---- NUM: 267 ---- PARENT
PID: 2713 ---- NUM: 267 ---- i = 4
BIGGEST NUMBER: 267

Любая помощь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...