Синхронизируйте N количество дочерних процессов в Unix, используя каналы для печати сообщения - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть школьное задание, которое говорит мне синхронизировать c n число процессов, использующих запись и чтение канала, я знаю, как синхронизировать c с 3 процессами, но сейчас у меня нет фиксированного числа детей чтобы создать. Для синхронизации c 3 процессов я использовал 3 канала и 3 файловых дескриптора, но теперь мне нужно создать канал и файловый дескриптор для каждого ребенка, но я не знаю, сколько у меня детей, потому что это пользователи вход. Мой вопрос: как мне синхронизировать c процессы, используя каналы, не зная, сколько каналов мне нужно?

Мне нужно печатать номер процесса, id и счетчик al oop до тех пор, пока пользователь не введет Ctrl ^ c

Обновление: я думаю, что я решил проблему создания N каналов с N fd массивами, моя реальная проблема заключается в том, как синхронизировать c N процессов для печати сообщения по порядку от первого до последнего потомка один и не в случайном порядке

Обновление 2: мне удалось синхронизировать c процессы, но он не l oop и зависает при последнем процессе

Мне нужна помощь Прошло 5 дней с тех пор, как я начал, и я схожу с ума

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



int main(int argc, char *argv[])
{
    char *ptr=argv[1];
    char inbuf[5];
    int n=atoi(ptr);//number of processes to be created

    //int **fdArray;

    //fdArray= (int**)malloc(n*sizeof(int*));


    //int fd[2];

    int fd[n][2];


    for(int i=0;i<n;i++)
    {
        //fdArray[i]=fd;
        pipe(fd[i]);
    }

    write(fd[0][1],"d",1);

    //write gia na mplokareis to prwto pedi

    for(int i=0;i<n;i++)
        if(fork()==0)
        {


            while(1)
            {
                read(fd[i][0],inbuf,1);
                write(fd[i+1][1],"d",1);
                printf("Process %d has process id %d i= %d \n",i,getpid(),i);   
                // an en i teleftea na gra4ei sti prwti alliws stin epomeni

                if(i==n-1)
                {    
                    write(fd[0][1],"d",1);
                    read(fd[i][0],inbuf,1);

                }

                else if(i<n)
                {
                    write(fd[i+1][1],"d",1);
                    read(fd[i][0],inbuf,1);
                }



            }

        }


    for(int i=0;i<n;i++)
        wait(NULL);

    return 0;
}
...