⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reader.c

📁 实现操作系统课程的pv操作
💻 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 + -