和用于分配、释放共享内存的 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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)