信号量讲解:点击打开链接
运行截图:
getRec.c
#include<sys/types.h> #include<linux/sem.h> #include<stdlib.h> #include<stdio.h> //假设系统中有四个资源,该进程每隔三秒占用一个资源 #define RESOURCE 4 int main(void) { key_t key; int semid; struct sembuf sbuf={0,-1,IPC_NOWAIT}; union semun arg; //创建进程 if((key=ftok("/home/liang/MyLearn/sem",'c'))==-1) { perror("ftok error!\n"); exit(1); } //创建信号量 if((semid=semget(key,1,IPC_CREAT|0666))==-1) { perror("semget error!\n"); exit(1); } //指定资源数 arg.val=RESOURCE; printf("可使用资源共有%d个!\n",arg.val); //设置资源值 if(semctl(semid,0,SETVAL,arg)==-1) { perror("semctl error!\n"); exit(1); } //占用资源 while(1) { if(semop(semid,&sbuf,1)==-1) { perror("semop error!"); //删除信号量 semctl(semid,0,IPC_RMID,0); exit(1); } sleep(3); } exit(0); }
returnRec.c
#include<sys/types.h> #include<linux/sem.h> #include<stdlib.h> #include<stdio.h> //显示可用资源的个数 int main(void) { key_t key; int semid,semval; union semun arg; //创建进程 if((key=ftok("/home/liang/MyLearn/sem",'c'))==-1) { perror("ftok error!\n"); exit(1); } //创建信号量 if((semid=semget(key,1,IPC_CREAT|0666))==-1) { perror("semget error!\n"); exit(1); } while(1) { if((semval=semctl(semid,0,GETVAL,0))==-1) { perror("semctl error"); //删除信号量 semctl(semid,0,IPC_RMID,0); exit(1); } if(semval>0) { printf("还有%d个资源可以使用!\n",semval); }else{ printf("没有资源可以使用!\n"); break; } sleep(3); } exit(0); }