Потребитель - проблема производителя с именованными каналами в C - PullRequest
0 голосов
/ 27 октября 2018

У меня есть задача реализовать две задачи, используя именованные каналы в C:

  • Несколько производителей - один потребитель
  • Один производитель - несколько потребителей

У меня уже была проблема с одним производителем - проблема с одним потребителем, но я не уверен, как я могу начать решать вышеуказанные задачи.

Вот мой единственный производитель - один код потребления:

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

const int dataAmountToProduce = 10;
int value = 0;
int const buforSize = 50;

void processProducer()
{
    int savePipe;
    while (value < dataAmountToProduce)
    {
        savePipe = open("pipe", O_WRONLY);
        value++;
        char str[buforSize];
        sprintf(str, "%d", value);
        printf("Producer %d produces value: %s\n", getpid(), str);
        write(savePipe, str, buforSize);
        if (value == dataAmountToProduce)
        {
            break;
        }
    }
    close(savePipe);
}

void processConsumer()
{
    int readPipe;
    while (value < dataAmountToProduce)
    {
        readPipe = open("pipe", O_RDONLY);
        char buf[buforSize];
        read(readPipe, buf, buforSize);
        printf("Consumer %d consumes value: %s\n", getpid(), buf);
        value = atoi(buf);
        if (value == dataAmountToProduce)
        {
            break;
        }
    }
    close(readPipe);
}

main()
{
    mkfifo("pipe", 0600);

    if (fork() == 0)
    {
        printf("Creating producer process %d\n", getpid());
        processProducer();
        printf("Producer process %d finished work\n", getpid());
        exit(0);
    }

    if (fork() == 0)
    {
        printf("Creating consumer process %d\n", getpid());
        processConsumer();
        printf("Consumer process %d finished work\n", getpid());
        exit(0);
    }

    wait(NULL);
    printf("Both child processes of process %d finished work.\n", getpid());
    exit(0);
}

1 Ответ

0 голосов
/ 29 октября 2018

ОК, я нашел решение сам, в обоих случаях я добавил этот блок в метод производителя:

 if (value == valuesAmountToProduce)
        {
            printf("Producent process %d sent END signal\n", getpid());
            for (int i = 0; i <= amountOfConsumers; i++)
            {
                write(savePipe, "END", wielkoscBufora);
            }

В коде потребителя я проверяю, передано ли значение END, если да, то я ломаюцикл:

if (strcmp(buf, "END") == 0)
        {
            printf("Consumer process %d recived END signal\n", getpid());
            break;
        }

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

...