操作系统读者写者问题 源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在linux环境下运行!
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<errno.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
int *readcount;
static int shmid,semid,s;
int main()
{
key_t semkey,shmkey,skey;
union semun arg;
if((semkey=ftok(".",0x16))==-1) printf("error1\n") ;
if((skey=ftok(".",0x36))==-1) printf("error3\n");
if((shmid=shmget(IPC_PRIVATE,1024,0600|IPC_CREAT))==-1) printf("error4\n"); if((shmat(shmid,NULL,0))==-1) printf("error!\n");
readcount=(int *)shmat(shmid,NULL,0);
semid=semget(semkey,1,0600|IPC_CREAT);
s=semget(skey,1,0600|IPC_CREAT);
arg.val=1;
semctl(semid,0,SETVAL,arg);
semctl(shmid,0,SETVAL,arg);
semctl(s,0,SETVAL,arg);
int initsem(int key)
{
return(semget(key,1,0600|IPC_CREAT|IPC_EXCL));
}
int P(int semidd,int semnun)
{
struct sembuf sops={semnun,-1,SEM_UNDO};
return(semop(semidd,&sops,1));
}
int V(int semidd,int semnun)
{
struct sembuf sops={semnun,+1,SEM_UNDO};
return(semop(semidd,&sops,1));
}
void writer(int k)
{
while(k>0)
{
P(s,0);
P(semid,0);
if(*readcount==0) P(shmid,0);
(*readcount)++;
V(semid,0);
V(s,0);
printf("XIE jing c\n");
P(semid,0);
(*readcount)--;;
if((*readcount)==0) V(shmid,0); V(semid,0);
k--;
}
}
void reader(int j)
{
while(j>0)
{
P(s,0);
P(shmid,0);
printf("DU jing c\n");
V(shmid,0);
V(s,0);
j--;
}
}
writer(5);
reader(6);
return 0;
}。