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

📄 writer.c

📁 实现操作系统课程的pv操作
💻 C
字号:
/*写者:writer.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.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是对系统调用的简单封装*/

/*下面的P,V是对系统调用的简单封装*/
int p(int semid)
{
  struct sembuf p_buf;
  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 (semid) falsed");
    exit (1);
  }
  else
    return (0);
}

int v(int semid)
{
  struct sembuf v_buf;/*struct sembuf 参见课件ppt*/
  v_buf.sem_num = 0;
  v_buf.sem_op = 1;
  v_buf.sem_flg = 0;
  if(semop(semid, &v_buf, 1)==-1)
  {
    perror (" v (semid) failed");
    exit (1);
  } 
  else
    return (0);
}

main()
{
  char *p_buffer;/*共享存储区1地址*/
 
  char product[128];/*事实只使用32B,128为了避免屏幕输入超过32*/
  int shmid1;/*共享存储区id*/
  int  semid_wrt;/*实现写者之间的互斥和作为第一个读者读的执行条件信号量的id*/
  shmid1 = shmget(SHMKEY1, BUFF_LEN * PRODUCT_LEN, 0777);/*连接共享存储区1*/
  p_buffer = (char*)shmat(shmid1, 0, 0);/*取共享存储区1地址*/

  
  semid_wrt= semget(SEMKEY_WRT,1, 0777);
  
p(semid_wrt);/*对私有信号量作P操作*/
  /*从屏幕接收数据*/
  printf("请写入数据!\n");
  gets(product);/*128的意义在此,此函数不检查字符串长度*/
  
  /*进入临界区*/
  
  strcpy(p_buffer,product);
  
 
 
 

  shmdt(p_buffer); /*离开缓冲区*/
  
  /*离开临界区*/

  v(semid_wrt);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -