消费者与产生者(实验6)

消费者与产生者(实验6),第1张

消费者与产生者(实验6)
#include
#include
#include
#include
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#define PERM S_IRUSR|S_IWUSR 
#define SEMKEY (key_t) 0x200
typedef union _senum {
    int val;
    struct semid_ds *buf;
    ushort *array;
} semun;
int semid;
static int count=0;
FILE *fp, *fp1, *fp2;
struct sembuf prmutex={ 0, -1, 0 }, pwmutex={ 1, -1, 0 }, ps={ 2, -1, 0 };
struct sembuf vrmutex={0,1,0},vwmutex={1,1,0},vs={2,1,0};

int initsem() {
    semun x;
    x.val = 1;
    if (semid = semget(SEMKEY, 3, 0600 | IPC_CREAT | IPC_EXCL) == -1) {
        if (errno == EEXIST)
            semid = semget(SEMKEY, 3, 0);
    }
    if (semctl(semid, 0, SETVAL, x) == -1) {
        perror("semct1 failedn");
        return (-1);
    }
    if (semctl(semid, 1, SETVAL, x) == -1) {
        perror("semct1 failedn");
        return (-1);
    }
    if (semctl(semid, 2, SETVAL, x) == -1) {
        perror("semct1 failedn");
        return (-1);
    }
    return (semid);
}


main() {
    int i, j, k;
    static int a[30];
    int shmid;
    int *pint, *pint2, addr, addr2;
    for (i = 0; i < 30; i++) { a[i] = i; }
    if ((shmid = shmget(IPC_PRIVATE, 4, PERM))==-1) {
        fprintf(stderr, "Create Share Memory Error:%sna", strerror(errno));
        exit(1);
    }
    addr = shmat(shmid, 0, 0);
    pint = (int *) addr;
    *pint = 0;
    semid = initsem();
    if (fork() ==
        0) { //writer
        semop(semid, &pwmutex, 1);
        printf("call writern");
        fp1 = fopen("a.txt", "w");
        for (k = 0; k < 20; k++) {
            fprintf(fp1, "%dn", 5 * k);
            printf("write %dn ", 5 * k);
        }
        fclose(fp1);
        printf("write finish!!!n");
        semop(semid, &vwmutex, 1);
        exit(0);
    } else {
        if (fork() == 0) {
            //reader 1
            semop(semid, &prmutex, 1);
            addr2 = shmat(shmid, 0, 0);
            pint2 = (int *) addr2;
            if (*pint2 == 0) semop(semid, &pwmutex, 1);
            *pint2 = *pint2 + 1;
            printf("reader 1 enter--- count=%dn", *pint2);
            semop(semid, &vrmutex, 1);
            fp = fopen("a.txt", "r");
            while (!feof(fp)) {
                fscanf(fp, "%d", &i);
                printf("reader 1 %dn", i);
            }
            semop(semid, &prmutex, 1);
            *pint2 = *pint2 - 1;
            printf("reader 1 exit--- count=%dn", *pint2); 
            //count=count-1; 
            // print("count=%dn",count);
            if (*pint2 == 0) semop(semid, &vwmutex, 1);
            semop(semid, &vrmutex, 1);
            exit(0);
        } else {
            if (fork() == 0) //reader
            {
                semop(semid, &prmutex, 1);
                addr2 = shmat(shmid, 0, 0);
                pint2 = (int *) addr2;
                if (*pint2 == 0) semop(semid, &pwmutex, 1);
                *pint2 = *pint2 + 1;
                printf("Read 2 enter+++++ count=%dn",*pint2); 
                // printf("Read 2 count=%dn",count); 
                // count=2; 
                // printf("count=%dn",count);
                semop(semid, &vrmutex, 1);
                fp = fopen("a.txt", "r");
                while (!feof(fp)) {
                    fscanf(fp, "%d", &i);
                    printf("reader2 %dn ", i);
                }
                semop(semid, &prmutex, 1); 
                //count=count-1;
                *pint2 = *pint2 - 1;
                printf("Read 2 exit+++++ count=%dn", *pint2); 
                //printf("Read 2 count=%dn",count);
                if (*pint2 == 0) semop(semid, &vwmutex, 1);
                semop(semid, &vrmutex, 1);
                exit(0);
            }
        }

    }
 }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5520592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存