linux中与 信号量有关的函数

来源:互联网 发布:阳江市问政网络平台 编辑:程序博客网 时间:2024/06/05 07:26

1,semget函数

 semget函数的作用:创建一个新信号量或者取得一个已有信号量的键。

  int semget(key_t  key,int num_sems,int sem_flags);

    第一个参数:key是整数值,不相关的进程可以通过它访问同一个信号量。程序对所有的信号量的访问都是间接的,它先提供一个键,再由系统生成一个相应的信号量标识符。只有 只有semget函数才直接使用信号量键,所有其他的信号量函数都是使用semget函数返回的信号量的表示符。

    第二个参数:num_sems参数是指定需要的信号量的数目。它几乎总是取值为1.

    第三个参数:sem_flags参数是一组标志,它的低端的9个比特是信号量的权限,也可以和值IPC_CREAT做按位或操作,来创建一个新的信号量。即使在设置了

IPC_CREAT标志后,给出的键是一个已有的信号键,也不会产生错误,如果函数用不到IPC_CREAT标志,该标志就会悄悄的被忽略掉,我们可以通过联合使用标志IPC_CREAT和IPC_EXCL来确保创建一个新的,唯一的信号量。如果信号量已经存在,它将返回一个错误。

      返回值:semget函数在成功时返回一个正数(非零)值,它就是其他信号量的标识符。如果失败,则返回-1。

2.semop函数

    函数的作用:semop函数用来改变信号量的值。

     int semop(int sem_id ,struct *sem_ops,size_t num_sem_ops);

    第一个参数:sem_id是由semget返回的信号量的标识符。

    第二个参数:sem_ops是指向一个结构数组的指针,每个数组元素至少包含以下几个成员:

      struct sembuf

      {

            short  sem_num;//是信号量的编号,除非要使用一组信号量,否则它的取值一般为0

            short  sem_op;//是信号量在一次操作中需要改变的数值(可以用非1的数值来改变信号量的值)。通常会用到两个值,一个是-1,也就是p操作,它等待信号量变为可用;一个是+1,也就是V操作,它发生信号表示信号量现在已可用。

            short   sem_flg;//通常被设置为SEM_UNDO    

       }

    第三个参数:信号操作结构的数量,恒大于或等于1.

3.semctl函数(可变参函数)

  函数作用:用来直接控制信号量信息。

   int semctl(int sem_id , int sem_num,int command,...);

   第一个参数:sem_id是由semget返回的信号量的标识符。

   第二个参数:是信号量编号,当需要用到一组信号量时,就要用到这个参数,它的一般取值为0,表示这是第一个也是唯一的一个信号量。

   第三个参数:command参数是将要采取的动作。command通常是下面两个的一个:

SETVAL:用来把信号量初始化为一个已知的值。p这个值通过union semun中的val成员设置,其作用是在信号量第一次使用。

IPC_RMID:用于删除一个已经无需继续使用的信号量的标识符。

    如果有第四个参数:它是一个union semun结构。它至少包含以下几个成员:

    union  semun

    {

          int val;//SETVAL(设置信号量集中的所有的信号量的值)使用的值

          struct semid_ds  *buf;//IPC_STAT(得到共享内存的状态),IPC_SET(改变共享内存的状态)使用缓存区

          unsigned  short *array;  //GETALL(用于读取信号量集中所有信号量的值),SETALL(设置信号集中所有的信                                                 //  号量的值)使用的数组

    }

返回值:semctl函数根据command参数的不同返回不同的值。对于SETVAL和IPC_RMID,成功时返回0,失败时返回-1.