信号量一般用于处理访问临界资源的同步问题。下面通过两个例子说明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!