我正在尝试制作一个同步3个进程的程序。第一个进程从终端读取并将字符串放入缓冲区,第二个进程从缓冲区读取并将其放入第二个缓冲区,第三个进程从第二个缓冲区读取并将其放入文件中。因此,应使用信号量(一个生产者,一个生产者/消费者和一个消费者)来管理对缓冲区的访问。第一个过程是生产者,第二个过程是生产者/消费者,第三个过程是消费者。
我已经完成了所有关于信号量的知识,但它似乎没有用(可能我应该使用共享内存?),到目前为止我所做的是:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <semaphore.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char T0[6];
char T1[6];
int ip=0;
int ic=0;
int icp=0;
typedef struct sem
{
sem_t libre1;
sem_t libre2;
sem_t occupe1;
sem_t occupe2;
sem_t mutex1;
sem_t mutex2;
}sem_arg;
void lire(char *c)
{
read(0,c,sizeof(c));
}
int main()
{
sem_arg args;
sem_init(&args.libre1,0,6);
sem_init(&args.libre2,0,6);
sem_init(&args.occupe1,0,0);
sem_init(&args.occupe2,0,0);
sem_init(&args.mutex1,0,1);
sem_init(&args.mutex2,0,1);
pid_t p;
int i; int cmpt0=0,cmpt1=0,cmpt2=0;
char *c;
c=(char*)malloc(sizeof(char)*6);
char *c1;
c1=(char*)malloc(sizeof(char)*6);
for(i=1;i<3;i++)
{
if((p=fork())==0)
{
if(i==1)
{
while(cmpt1<6)
{
sem_wait(&args.libre2);
sem_wait(&args.occupe1);
sem_wait(&args.mutex1);
sem_wait(&args.mutex2);
T1[icp]=T0[ip];
icp=(icp+1)%6;
cmpt1++;
sem_post(&args.mutex1);
sem_post(&args.mutex2);
sem_post(&args.libre1);
sem_post(&args.occupe2);
}
}
else if(i==2)
{
FILE *fichier=fopen("prosecuss2.txt","w");
while(cmpt2<6)
{
sem_wait(&args.occupe2);
sem_wait(&args.mutex1);
fprintf(fichier,"%c\n",T1[ic]);
fflush(fichier);
ic=(ic+1)%6;
cmpt2++;
sem_post(&args.mutex1);
sem_post(&args.libre2);
}
}
}
}
while(cmpt0<6)
{
lire(c);
c1=encrypt(c);
sem_wait(&args.libre1);
sem_wait(&args.mutex1);
T0[ip]=*c1;
ip=(ip+1)%6;
cmpt0++;
sem_post(&args.mutex1);
sem_post(&args.occupe1);
}
return 0;
}
该计划有什么问题?我应该使用线程吗?