Увеличьте и передайте целое число, используя трубы в C - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь написать программу, которая инициализирует целое число в родительском элементе, а затем в первом fork () мы берем это значение, увеличиваем его и передаем по трубе следующему процессу, вызываемому текущим дочерним элементом. Это продолжается еще 2 раза. Моя проблема в том, что я устанавливаю целое число равным 96, и в идеале, поскольку у нас есть 3 процесса, программа должна вернуть 99. Но вместо этого она возвращает «a», что означает, что она увеличилась только один раз. Это мой код:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>

int main(int argc, char **argv)
{
        int status;
        int i;

        int pipes[4];

        pipe(pipes);
        pipe(pipes + 2);
        int num = 96;

        if (fork() == 0)
        {
                dup2(pipes[1], 1);

                close(pipes[0]);
                close(pipes[1]);
                close(pipes[2]);
                close(pipes[3]);
                num++;
                write(pipes[1], &num, sizeof(int));
        }
        else
        {
                if (fork() == 0)
                {
                        dup2(pipes[0], 0);
                        dup2(pipes[3], 1);

                        close(pipes[0]);
                        close(pipes[1]);
                        close(pipes[2]);
                        close(pipes[3]);
                        read(pipes[0], &num, sizeof(int));
                        num++;
                        write(pipes[3], &num, sizeof(int));
                }
                else
                {
                        if (fork() == 0)
                        {
                                dup2(pipes[2], 0);
                                close(pipes[0]);
                                close(pipes[1]);
                                close(pipes[2]);
                                close(pipes[3]);
                                read(pipes[2], &num, sizeof(int));
                                num++;
                                write(1, &num, sizeof(int));
                        }
                }
        }

        close(pipes[0]);
        close(pipes[1]);
        close(pipes[2]);
        close(pipes[3]);

        for (i = 0; i < 3; i++)
                wait(&status);
}
  1. Как мне сделать так, чтобы печаталось целое число?
  2. Почему мое приращение работает только один раз?

1 Ответ

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

Вы close(pipe[0]), а затем попробуйте прочитать с него. Читайте с dup'd FD вместо. Вы заметите эту ошибку, если вы проверили значения, возвращенные из read и write.

Чтобы напечатать целое число, используйте printf("%d", num) вместо записи. Причина, по которой num увеличивается только один раз, заключается в том, что read в последнем дочернем элементе завершается сбоем и не изменяется num, поэтому после read num сохраняет значение, которое имело при инициализации.

Все, что вам нужно сделать, это либо удалить вызовы close изнутри условий (все каналы дважды закрываются в текущем коде (или, точнее, они закрываются один раз, а затем вторая попытка их закрытия не удалась, но сбой остается незамеченным)) или чтение / запись из / в dup'd fd.

...