信号量的应用实例
2011-06-19 11:18
176 查看
信号量一般用于处理访问临界资源的同步问题。下面通过两个例子说明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!
例 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!
相关文章推荐
- Linux C编程--进程间通信(IPC)6--综合应用实例--信号量和共享内存的使用
- Linux C编程--进程间通信(IPC)6--综合应用实例--信号量和共享内存的使用
- Linux C编程--进程间通信(IPC)6--综合应用实例--信号量和共享内存的使用
- ucos试验代码实例2:互斥型信号量的应用实例--防止任务优先级反转现象的出现
- 【Linux基础】信号量应用实例
- UCOS2_STM32_任务间信号量通信(一)_应用实例描述
- linux应用编程:signal(信号量) 实例1
- JFreeChart在JSP中的应用实例
- Log4net 框架系列:log4net日志文件在asp.net中的应用实例-记录系统错误
- 零基础学python-17.4 参数匹配应用实例
- Android应用底部导航栏(选项卡)实例
- Quartz+Spring实例应用【一】基于Spring的MethodInvokingJobDetailFactoryBean实现
- 新手上路:JDBC初级应用实例(一)
- JSP表单应用实例
- Spring + mybatis整合实例应用
- 【树莓派自动化应用实例】整点提醒自己休息五分钟
- 百度地图应用实例两则
- Jquery+JSON+WebService 应用实例....
- Docker容器虚拟化(四)—dockerfile的格式与应用(with实例)
- UCenter在JAVA项目中实现的单点登录应用实例