📄 reader.c
字号:
/*读者:reader.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>#include <unistd.h>
#include <errno.h>
#include <string.h>
#define SHMKEY1 9075 /*共享存储区的键*/
#define SHMKEY2 9076/*公共变量readcount的存储区的键*/
#define SEMKEY_WRT 9085 /*实现写者之间的互斥和作为第一个读者读的执行条件信号量的键*/
#define SEMKEY_MUTEX 9087 /*对readcount实现互斥修改的互斥信号量的键*/
#define BUFF_LEN 1 /*缓冲区的大小为1*/
#define PRODUCT_LEN 32 /*每个产品是一个字符串:<=32字符*/
/*下面的P,V是对系统调用的简单封装*/
int P(int semid)
{
struct sembuf p_buf;/*struct sembuf 参见课件ppt*/
p_buf.sem_num = 0;
p_buf.sem_op = -1;
p_buf.sem_flg = 0;
if(semop(semid, &p_buf, 1)==-1)/*semop参见课件ppt*/
{
perror ("p操作失败!");
exit (1);
}
else
return (0);
}
int v(int semid)
{
struct sembuf v_buf;
v_buf.sem_num = 0;
v_buf.sem_op = 1;
v_buf.sem_flg = 0;
if(semop(semid, &v_buf, 1)==-1)
{
perror (" v操作失败!");
exit (1);
}
else
return (0);
}
main()
{
char *p_buffer;/*共享存储区地址*/
int *p;/*公共变量存储区的地址*/
char product[33];/*它从缓冲区中读取数据*/
int shmid1,shmid2;/*共享存储区id的集合*/
int semid_wrt, semid_mutex;/*信号量集合id*/
shmid1 = shmget(SHMKEY1, BUFF_LEN * PRODUCT_LEN, 0777);/*连接共享存储区1*/
shmid2 = shmget(SHMKEY2, sizeof(int), 0777);/*连接共享存储区2*/
p_buffer = (char*)shmat(shmid1, 0, 0);/*取共享存储区1地址*/
p=(int*)shmat(shmid2, 0, 0);/*取共享存储区2地址*/
semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*获取共有信号量id*/
semid_wrt = semget(SEMKEY_WRT,1, 0777);
/*进入临界区*/
P(semid_mutex);/*对共有信号量作P操作*/
(*p)++;
if((*p)==1)
P(semid_wrt);
v(semid_mutex);
strcpy(product, p_buffer );
/*消费产品:在屏幕上输出*/
printf("读者读取数据成功:\n");
printf("====:%s\n", product); printf("program delay 10 second! \n");sleep(10);
shmdt(p_buffer); /*离开缓冲区*/
P(semid_mutex);
(*p)--;
if((*p)==0)
v(semid_wrt);
v(semid_mutex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -