信号量及PV操作

1、 Unix下信号量的使用:
int semget(key_t key,int nsems,int permflags);
Unix使用semget调用创建或者获得信号量集合,三个参数中,其中key是唯一标示该信号量集合的标号,以后要获得已经创建的信号量都是通过它;nsems是要创建的信号量的个数,如果个数大于1,那么这将是一个信号量集合,其索引号是用0至到nsems-1;permflags是一组标志,其作用主要是说明该信号量的访问权限;
算法中
#define SEM_KEY 1002
定义了要用到的信号量集的key;
还有两个必须用到的关于信号量的系统调用:
int semctl(int semid,int sem_num,int command,union semun ctl_arg);
Int semop(int semid,struct sembuf *op_array,size_t num_ops);
semctl是用于对信号量的控制,如信号量值的设置获取等;semop是对信号量的操作,在下面将看到我定义的PV操作将使用到semop函数;

2、 Unix下PV操作的实现:
int p(int semid,int sem_index)
{
    struct sembuf sb;
    sb.sem_num = sem_index;
    sb.sem_op = -1;
    sb.sem_flg = SEM_UNDO;
    if(semop(semid,&sb,1)==-1)
    {
        printf("PID(%d)--P():failed!\n",getpid());
        return(FALSE);
    }
    return(TRUE);
}
int v(int semid,int sem_index)
{
    struct sembuf sb;
    sb.sem_num = sem_index;
    sb.sem_op = 1;
    sb.sem_flg = SEM_UNDO;
    if(semop(semid,&sb,1)==-1)
    {
         printf("PID(%d)--V():failed!\n",getpid());
         return(FALSE);
    }
    return(TRUE);
}
以上是PV操作的函数定义,通过传递给p()或v()一个semid和sem_index,对需要的信号量集合中的指定信号量进行操作.

posted @ 2006-02-17 21:09  xiaoyixy  阅读(1971)  评论(0编辑  收藏  举报