#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); } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)