linux下C语言编程6-信号量函数semget() semop() semctl()

semget()
创建一个新的信号量集,或者使用一个已经存在的信号量集。
系统调用:semget();
原型:int semget(key_t key, int nsems, int semflg);
参数:第一个参数是关键字值(一般是由系统调用ftok()返回的)。
第二个参数nsems指出一个新的信号量集合中应该创建的信号量的个数。可以将信号量集合理解为数组,长度为nsems。最大个数定义在linux/sem.h,我的ubuntu8中最大个数为250
返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1。
errno不再描述。

semop()
信号量操作
调用原型:int semop(int semid, struct sembuf *sops,unsigned nsops);
参数:第一个参数是关键字值,由semget返回得来。第二个参数是指向将要操作的数组的指针。第三个参数是数组中的操作的个数。nsops为数组sops的大小。
第二个参数结构体如下:
struct sembuf {
    unsigned short      sem_num;        /* 使用第sem_num个信号量 */
    short            sem_op;        /* 信号量操作 */
    short            sem_flg;        /* 操作标志 */
};
sem_num对应信号集中的信号灯,0对应第一个信号灯。sem_flg可取IPC_NOWAIT以及SEM_UNDO两个标志。如果设置了SEM_UNDO标志,那么在进程结束时,相应的操作将被取消,这是比较重要的一个标志位。如果设置了该标志位,那么在进程没有释放共享资源就退出时,内核将代为释放。sem_op的值大于0,等于0以及小于0确定了对sem_num指定的信号灯进行的三种操作。
sem_op>0:相应进程要释放sem_op数目的共享资源;
sem_op=0:用于对共享资源是否已用完的测试;
sem_op<0:进程要申请-sem_op个共享资源。
个人理解:某进程要使用某资源时,先判断sem_op是否为0,然后设定sem_op>0,使用完后sem_op<0。
返回值:0,成功。-1,失败。
errno不再描述。

semctl()
实现对信号灯的各种控制操作。
系统调用:semctl();
原型:int semctl(int semid, int semnum, int cmd, union semunarg);
参数:
参数semid指定信号灯集,参数semnum指定对哪个信号灯操作,参数cmd指定具体的操作类型,只对几个特殊的cmd操作有意义;semunarg用于设置或返回信号灯信息,代表一个semun实例,该参数可以忽略。
参数cmd中可以使用的命令如下:
    ·IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
    ·IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
    ·IPC_RMID将信号量集从内存中删除。
    ·GETALL用于读取信号量集中的所有信号量的值。
    ·GETNCNT返回正在等待资源的进程数目。
    ·GETPID返回最后一个执行semop操作的进程的PID。
    ·GETVAL返回信号量集中的一个单个的信号量的值。
    ·GETZCNT返回这在等待完全空闲的资源的进程数目。
    ·SETALL设置信号量集中的所有的信号量的值。
    ·SETVAL设置信号量集中的一个单独的信号量的值。
返回值:如果成功,则为一个正数。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值