Непрерывно читается из трубы в C - PullRequest
0 голосов
/ 10 марта 2020

Мне нужно разработать программу, в которой у меня есть 10 дочерних процессов, каждый из которых обрабатывает часть массива, и всякий раз, когда в этой части обнаруживается число больше 20, процесс записывает его в процесс pather через канал.

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

for (i = 0; i < CHILDS; i++)
    {
        pids[i] = fork();
        if (pids[i] == 0)
        {
            for (j = 5000 * i; j < (5000 * i) + 5000; j++)
            {
                if (array[j].quantity > 20)
                {
                    write(fd[1], &array[j].product_code, sizeof(array[j].product_code));
                }
            }
            exit(0);
        }
    } 

Как я могу бесконечно читать из этого канала в родительском процессе и всякий раз, когда он читает что-то, записывать его на массив?

Я пробовал это, но не работает:

    while ((p_code = read(fd[0], &p_code, sizeof(p_code))) > 0)
    {
        products[i] = p_code;
        i++;
    }

Спасибо: D

1 Ответ

1 голос
/ 10 марта 2020

Вы неправильно читаете трубу. Замените:

 while ((p_code = read(fd[0], &p_code, sizeof(p_code))) > 0)

на

ssize_t rc;
while ((rc = read(fd[0], &p_code, sizeof p_code)) > 0)

Не следует перезаписывать только что прочитанные данные значением, возвращаемым read.

Также вы хотите проверить, что r c <0, чтобы перехватить какие-либо ошибки, проверить возвращаемое значение <code>write для ошибок и убедиться, что родитель закрыл fd[1] (если только вам это не нужно для чего-то, что вы не показали, что есть).

...