C 在Unix中使用管道打印消息同步N个子进程

C 在Unix中使用管道打印消息同步N个子进程,c,unix,pipe,fork,child-process,C,Unix,Pipe,Fork,Child Process,我有一个学校作业,告诉我使用pipe的写和读同步n个进程,我知道如何与3个进程同步,但目前我没有固定数量的子进程要创建。要同步3个进程,我使用了3个管道和3个文件描述符,但现在我需要为每个子进程创建一个管道和一个文件描述符,但我不知道有多少子进程,因为这是用户输入。我的问题是,在不知道需要多少管道的情况下,如何使用管道同步进程 我需要永远打印进程号、id和循环计数器,直到用户输入ctrl^c 更新:我想我解决了用N个fd数组创建N个管道的问题,我真正的挑战是如何同步N个进程,以按顺序从第一个子到

我有一个学校作业,告诉我使用pipe的写和读同步n个进程,我知道如何与3个进程同步,但目前我没有固定数量的子进程要创建。要同步3个进程,我使用了3个管道和3个文件描述符,但现在我需要为每个子进程创建一个管道和一个文件描述符,但我不知道有多少子进程,因为这是用户输入。我的问题是,在不知道需要多少管道的情况下,如何使用管道同步进程

我需要永远打印进程号、id和循环计数器,直到用户输入ctrl^c

更新:我想我解决了用N个fd数组创建N个管道的问题,我真正的挑战是如何同步N个进程,以按顺序从第一个子到最后一个子打印消息,而不是按随机顺序

更新2:我成功地同步了进程,但它没有循环,并且在最后一个进程挂起

我需要帮助自从我开始工作已经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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*ptr=argv[1];
char-inbuf[5];
int n=atoi(ptr);//要创建的进程数
//int**fd阵列;
//fdArray=(int**)malloc(n*sizeof(int*);
//int-fd[2];
int fd[n][2];

对于(int i=0;i您熟悉数组吗?您可以维护一个文件描述符对数组(如果需要,还可以维护PID)。可能需要对其进行malloc以进行动态分配。是的,我忘了提到我正在使用fd[2]数组,但它不是一个固定的数字,我必须创建的管道和FD数组取决于用户的权限,所以你可能需要动态地分配一个数组来存储所有的FDS从管道……每当你遇到一个存储N个相关事物的问题时,考虑单个变量的集合。我试试看,谢谢“最后一个进程挂起”。可能是因为你没有关闭任何东西。无论何时调用管道/分叉,都要非常小心地关闭所有东西。