在进程之间使用信号量

时间:2016-12-19 23:16:00

标签: c semaphore

我正在尝试制作一个同步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;
}

该计划有什么问题?我应该使用线程吗?

0 个答案:

没有答案