您的位置:首页 > 职场人生

信号量的应用实例

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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息