linux进程间信号量的分配释放

linux进程间信号量的分配释放,第1张

和用于分配、释放共享内存的 shmget 和 shmctl 类似,系统调用 semget 和 semctl 负责分配、释放信号量。调用 semget 函数并传递如下参数:一个用于标识信号量组的键值,该组中包含的信号量数量和与 shmget 所需的相同的权限位标识。该函数返回的是信号量组的标识符。您可以通过指定正确的键值来获取一个已经存在的信号量的标识符;这种情况下,传递的信号量组的容量可以为0。

信号量会一直保存在系统中,甚至所有使用它们的进程都退出后也不会自动被销毁。最后一个使用信号量的进程必须明确地删除所使用的信号量组,来确保系统中不会有太多闲置的信号量组,从而导致无法创建新的信号量组。可以通过调用semctl来删除信号量组。调用时的四个参数分别为信号量组的标识符,操作的信号量在组中的编号、常量IPC_RMID 和一个 union semun 类型的任意值(被忽略)。调用进程的有效用户 id 必须与分配这个信号量组的用户 id 相同(或者调用进程为 root 权限亦可)。与共享内存不同,删除一个信号量组会导致 Linux 立即释放资源。

代码 5.2 展示了用于分配和释放一个二元信号量的函数。

代码 5.2 (sem_all_deall.c)分配和释放二元信号量

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/types.h>/* 我们必须自己定义 semun 联合类型。 */

union semun { int valstruct semid_ds *bufunsigned short int *arraystruct seminfo *__buf}

/* 获取一个二元信号量的标识符。如果需要则创建这个信号量 */

int binary_semaphore_allocation (key_t key, int sem_flags)

{

return semget (key, 1, sem_flags)

} /* 释放二元信号量。所有用户必须已经结束使用这个信号量。如果失败,返回 -1 */

int binary_semaphore_deallocate (int semid)

{

union semun ignored_argumentreturn semctl (semid, 1, IPC_RMID, ignored_argument)

}

sem_init:初始化信号量sem_t初始化候指定信号量初始值及否进程间共享

sem_wait:直阻塞等待直信号量>0

sem_timedwait:阻塞等待若干间直信号量>0

sem_post:使信号量加1

sem_destroy:释放信号量sem_init应 答案补充 关于各函数具体参数请用man查看,man sem_init查看该函数帮助

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。

sem_wait:一直阻塞等待直到信号量>0。

sem_timedwait:阻塞等待若干时间直到信号量>0。

sem_post:使信号量加1。

sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

信号量的工作原理

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

Linux的信号量机制

Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/245645.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存