操作系统进程--互斥实验

这是一个关于操作系统进程互斥的实验,包含头文件`ipc.h`,源代码如`ipc.c`、`barber.c`和`customer.c`,以及`Makefile`用于构建`customer`和`barber`两个程序。实验通过`gcc`编译器进行编译,并提供了清理编译产物的指令。
摘要由CSDN通过智能技术生成

ipc.h:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#define BUFSZ	256
#define MAXVAL	100
#define STRSIZ	8
#define WRITERQUEST	1  //写请求标识
#define READERQUEST	2 //读请求标识
#define FINISHED	3 //读写完成标识
#define SOFA 4

/*信号灯控制用的共同体*/
typedef union semuns {
int val;
} Sem_uns;
/* 消息结构体*/
typedef struct msgbuf {
long mtype;
int mid;
} Msg_buf;

key_t customer_key;
int customer_sem;
key_t account_key;
int account_sem;
int sem_flg;
int sem_val;

int wait_quest_flg;
key_t wait_quest_key;
int wait_quest_id;
int wait_respond_flg;
key_t wait_respond_key;
int wait_respond_id;
int sofa_quest_flg;
key_t sofa_quest_key;
int sofa_quest_id;
int sofa_respond_flg;
key_t sofa_respond_key;
int sofa_respond_id;

int get_ipc_id(char *proc_file,key_t key);
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
int set_msq(key_t msq_key,int msq_flag);
int set_sem(key_t sem_key,int sem_val,int sem_flag);
int down(int sem_id);
int up(int sem_id);

ipc.c:

#include "ipc.h"
/*
* get_ipc_id() 从/proc/sysvipc/文件系统中获取IPC的id号
* pfile: 对应/proc/sysvipc/目录中的IPC文件分别为
*
msg-消息队列,sem-信号量,shm-共享内存
* key:
对应要获取的IPC的id号的键值
*/
int get_ipc_id(char *proc_file,key_t key)
{
  FILE *pf;
  int i,j;
  char line[BUFSZ],colum[BUFSZ];
  if((pf = fopen(proc_file,"r")) == NULL){
  perror("Proc file not open");
  exit(EXIT_FAILURE);
  }
  fgets(line, BUFSZ,pf);
  while(!feof(pf)){
  i = j = 0;
  fgets(line, BUFSZ,pf);
  while(line[i] == ' ') i++;
  while(line[i] !=' ') colum[j++] = line[i++];
  colum[j] = '\0';
  if(atoi(colum) != key) continue;
  j=0;
  while(line[i] == ' ') i++;
  while(line[i] !=' ') colum[j++] = line[i++];
  colum[j] = '\0';
  i = atoi(colum);
  fclose(pf);
  return i;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值