栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

消费者与产生者(实验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);
            }
        }

    }
 }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528783.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号