?? 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 + -