信号量一般用于处理访问临界资源的同步问题。下面通过两个例子说明P、V操作以及使用程序server.c和client.c程序来演示信号量如何控制对资源的访问;sevrer.c 用来创建一个信号集,并对信号量循环减1,相当于分配资源;client执行时检查信号量,如果其值大于0代表有资源可用,继续执行,如果小于0代表资源已经分配完毕,进程client推出。
例 server.c
#include<sys/types.h>
#include<linux/sem.h>
#include<stdlib.h>
#define MAX_RESOURCE 5
int main(void)
{
key_t key;
int semid;
struct sembuf sbuf = {0,-1,IPC_NOWAIT};
union semun semopts;
if((key = ftok(".",'s'))==-1)
{
perror("ftok error!\n");
exit(-1);
}
if((semid = semget(key,1,IPC_CREAT|0666))==-1)
{
perror("semget error!\n");
exit(1);
}
semopts.val = MAX_RESOURCE;
if(semctl(semid,0,SETVAL,semopts)==-1)
{
perror("semctl error!\n");
exit(1);
}
while(1)
{
if(semop(semid,&sbuf,1)==-1)
{
perror("semop error!\n");
exit(1);
}
sleep(3);
}
exit(0);
}
在上面的例子中进行编译运行时出现了警告exit未定义(解决办法:加入头文件#include<stdlib.h>)
例client.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 semopts;
if((key = ftok (".",'s'))==-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!\n");
exit(1);
}
if(semval>0)
{
printf("Still %d resources can be used\n",semval);
}
else
{
printf("No more resources can be used!\n");
break;
}
sleep(3);
}
exit(0);
}
在编译这个程序时出现了没有printf的定义(解决方法:#include<stdio.h>)
程序运行说明:
首先在一个终端上编译并运行server.c ,再在另一个终端上运行client.c ;观察client.c 的运行结果
wzy@wzy-Desktop:~/temp1$ ./server
semop error!
: Resource temporarily unavailable
wzy@wzy-Desktop:~/temp1$ ./clinet
Still 3 resources can be used
Still 2 resources can be used
Still 1 resources can be used
No more resources can be used!