📄 sample.c
字号:
#include <sys/types.h>#include <sys/ipc.h>
#include <sys/sem.h>#include <stdio.h>
#define KEY (key_t) //后面自己使用两个随机的数值
#define KEY2 (key_t)
#define MAX_BUFFER_SIZE 10 //缓冲区最大缓冲个数
union semun {
int val;
struct semid_ds *buf;
ushort *array;
}; //用于semctl函数的控制结构
typedef struct _tagShareBuffer{
int buffer[MAX_BUFFER_SIZE];
int writer;
int reader;
}SHAREBUFFER; //共享内存中的结构
int main(){ int shmid; //共享内存id char* shmPtr; //指向共享内存首地址的指针
SHAREBUFFER* pSharebuffer; //共享内存结构体指针
int product = 0; //产品值,生产一件自加1
int semid; //信号集id
struct sembuf mutex,empty,full; //三个信号量的控制变量
int i;
//
//创建或打开一个键值为KEY的信号量集合,包含3个信号量,并返回一个信号量集合id
//
if ((semid = semget(KEY,3,IPC_CREAT|0660)) == -1)
{
printf("semget error! \n");
return -1;
}
/*********************************************************
* 初始化信号量的初值
* 第0个信号量用于互斥,初值为1
* 第1个信号量用于生产者,初值为MAX_BUFFER_SIZE
* 第2个信号量用于消费者,初值为0
* arg是用于给信号量赋值的一个中间过渡变量,不必理会
*********************************************************/
union semun arg[3];
arg[0].val = 1;
arg[1].val = MAX_BUFFER_SIZE;
arg[2].val = 0;
for(i=0;i<3;i++)
semctl(semid,i,SETVAL,arg[i]); //赋值语句,因为信号是核心对象,所以要使用特殊的系统调用赋值
for(i=0;i<3;i++)
printf("The semval(%d) = %d\n",i,semctl(semid,i,GETVAL,NULL));
//**************************
//创建或打开一个键值为KEY的共享内存块,并返回它的id
//将KEY值加1,避免与信号量集的key相同
if ((shmid = shmget(KEY+1,sizeof(SHAREBUFFER),IPC_CREAT)) < 0) { printf("shmget error!\n"); return -1; }
//
//将共享内存映射到进程空间里,并返回共享内存首地址
// if((shmPtr = (char*)shmat(shmid,0,0)) == (void*)-1) { printf("shmat error!\n"); return -1; }
memset((void*)shmPtr,0,sizeof(SHAREBUFFER)); //将共享内存空间清0
pSharebuffer = (SHAREBUFFER*)shmPtr;
//
//下面开始向ShareBuffer中生产产品
//
while(1)
{
empty.sem_num = 1; //指操作哪个信号量
empty.sem_op = -1; //要对信号量的值作减1操作
empty.sem_flg = 0; //控制标识符
semop(semid,&empty,1); //P(empty)
pSharebuffer->buffer[pSharebuffer->writer] = product;
for(i=0;i<3;i++)
printf("The semval(%d) = %d\n",i,semctl(semid,i,GETVAL,NULL));
printf("Produced the product into buffer[%d] = %d;\n",pSharebuffer->writer,product);
product++;
mutex.sem_num = 0;
mutex.sem_op = -1;
mutex.sem_flg = 0;
semop(semid,&mutex,1); //P(mutex)
pSharebuffer->writer = (pSharebuffer->writer + 1) % MAX_BUFFER_SIZE;
mutex.sem_num = 0;
mutex.sem_op = 1;
mutex.sem_flg = 0;
semop(semid,&mutex,1); //V(mutex)
full.sem_num = 2;
full.sem_op = 1;
full.sem_flg = 0;
semop(semid,&full,1); //V(full)
sleep(1); //调节一下生产速度^_^
}
return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -