C 在Unix中使用管道打印消息同步N个子进程
我有一个学校作业,告诉我使用pipe的写和读同步n个进程,我知道如何与3个进程同步,但目前我没有固定数量的子进程要创建。要同步3个进程,我使用了3个管道和3个文件描述符,但现在我需要为每个子进程创建一个管道和一个文件描述符,但我不知道有多少子进程,因为这是用户输入。我的问题是,在不知道需要多少管道的情况下,如何使用管道同步进程 我需要永远打印进程号、id和循环计数器,直到用户输入ctrl^c 更新:我想我解决了用N个fd数组创建N个管道的问题,我真正的挑战是如何同步N个进程,以按顺序从第一个子到最后一个子打印消息,而不是按随机顺序 更新2:我成功地同步了进程,但它没有循环,并且在最后一个进程挂起 我需要帮助自从我开始工作已经5天了,我快疯了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个进程,以按顺序从第一个子到
#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个相关事物的问题时,考虑单个变量的集合。我试试看,谢谢“最后一个进程挂起”。可能是因为你没有关闭任何东西。无论何时调用管道/分叉,都要非常小心地关闭所有东西。