трубы не отправляют вкладку - PullRequest
0 голосов
/ 01 апреля 2020

В моем коде мне нужно использовать несколько каналов, отец должен посылать каждому сыновью интервал, и в этом интервале сын должен искать простые числа.

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

int main(void)
{
    const int p = 4;
    const int n = 500;

    int k, i, j;
    int premier;

    pid_t fils[p];
    int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];

    pipe(tubePere);
    for (k = 0; k < p; k++)
    {
        pipe(tubeFils[p]);
        fils[k] = fork();
        intervals1[0] = k * n/p + 1;
        intervals1[1] = (k + 1) * n/p;
        printf("intervals1 : %d .. %d\n",intervals1[0], intervals1[1]);
        close(tubeFils[k][0]);
        write(tubeFils[k][1], intervals1, sizeof(intervals1));
        if (fils[k] == 0)
        {
            close(tubeFils[k][1]);
            read(tubeFils[k][0],  intervals2, sizeof(intervals2));
            printf("intervals2 : %d .. %d\n",intervals2[0], intervals2[1]);
            for (i = intervals1[0]; i <= intervals2[1]; i++)
            {
                if (i == 1)
                    premier = 0;
                else if (i == 2)
                    premier = 1;
                else
                {
                    j = 2;
                    premier = 1;
                    while ((j <= sqrt(i)) && (premier == 1))
                    {
                        if ((i%j) == 0)
                            premier = 0;
                        j++;
                    }
                }
                if (premier == 1)
                {
                   //printf("%d  ",i);
                }
            }
            exit(0);

        }
        else if (fils[k] == -1)
            printf("Error\n");
    }
    return 0;
}

Я отображал интервалы, полученные сыновьями и отправленные отцом

intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 0 .. 255
intervals1 : 1 .. 125
intervals2 : 0 .. 255

1 Ответ

0 голосов
/ 01 апреля 2020

Вы делаете pere write в и pere и fil вместо только в pere.

Ваш второй вызов по каналу - pipe(tubefils[p]), но он должно быть pipe(tubefils[k])

Вы должны сделать wait в конце pere.

И вы должны закрыть конец записи канала в родительском объекте после выполнения записи.

И после чтения вы должны закрыть конец канала в дочернем элементе.


Вот некоторый исправленный код:

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

int
main(void)
{
    const int p = 4;
    const int n = 500;

    int k, i, j;
    int premier;

    pid_t pid;
    pid_t fils[p];
    int tubePere[2], tubeFils[p][2], intervals1[2], intervals2[2];

    pipe(tubePere);
    for (k = 0; k < p; k++) {
#if 0
        pipe(tubeFils[p]);
#else
        pipe(tubeFils[k]);
#endif

        pid = fork();
        fils[k] = pid;

        if (pid < 0) {
            printf("Error\n");
            exit(1);
        }

        // pere ...
        if (pid != 0) {
            intervals1[0] = k * n / p + 1;
            intervals1[1] = (k + 1) * n / p;
            printf("intervals1 : %d .. %d\n", intervals1[0], intervals1[1]);
            close(tubeFils[k][0]);
            write(tubeFils[k][1], intervals1, sizeof(intervals1));
            close(tubeFils[k][0]);
            continue;
        }

        // fils ...
        close(tubeFils[k][1]);
        read(tubeFils[k][0], intervals2, sizeof(intervals2));
        close(tubeFils[k][0]);

        printf("intervals2 : %d .. %d\n", intervals2[0], intervals2[1]);

        for (i = intervals1[0]; i <= intervals2[1]; i++) {
            if (i == 1)
                premier = 0;
            else if (i == 2)
                premier = 1;
            else {
                j = 2;
                premier = 1;
                while ((j <= sqrt(i)) && (premier == 1)) {
                    if ((i % j) == 0)
                        premier = 0;
                    j++;
                }
            }
            if (premier == 1) {
                // printf("%d ",i);
            }
        }
        exit(0);
    }

    while (1) {
        pid = wait(NULL);
        if (pid <= 0)
            break;
    }
    return 0;
}

Вот исправленный вывод:

intervals2 : 1 .. 125
intervals1 : 1 .. 125
intervals2 : 126 .. 250
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals2 : 376 .. 500
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals2 : 251 .. 375
intervals1 : 1 .. 125
intervals1 : 126 .. 250
intervals1 : 251 .. 375
intervals1 : 376 .. 500
...