1)Linux下互斥信号量的作用
互斥信号量主要是用于访问共享资源时保证操作的原子性,即为一个整体的动作不允许被打断。
2)Linux下的文件操作函数的学习方式
man命令学习函数使用,写一个小代码,将函数用起来。
下面就带大家学习下互斥信号量相关的函数,然后用代码将这些函数串联起来,并用并行脚本进行一下验证。
2 Linux下互斥信号量相关的函数
1)ftok函数
ftok函数用于构造键值。
① 函数原型。
- key_t ftok( char * fname, int id )
② 头文件。
- include <sys/types.h>
- include <sys/ipc.h>
③ 参数。
fname:文件名在内核中的一种数字表示。
id:项目id号。
键值有fname和项目id号组合产生。
④ 返回值。
成功:返回产生的键值。
失败:-1。
2)semget函数
semget函数用于创建打开信号量。
① 函数原型。
- int semget(key_t key,int nsems,int semflg)
获取信号量集合的标示符。
当key所指定的信号量不存在的时候,并且semflg里包含了IPC_CREAT,这个时候,就会创建一个信号量集。
② 头文件。
- include <sys/types.h>
- include <sys/ipc.h>
- include <sys/sem.h>
③ 参数。
key:键值。
semflay:标志,可以去IPC_CREAT,对应键值的信号量如果不存在还可以创建信号量。
nsems:创建的这个信号量集合里面包含的信号量数目。
④ 返回值。
成功:返回信号量集合的标示符。
失败:-1。
3)semctl函数
semctl函数在一个信号量集或集合中的单个信号量上执行各种控制操作。
① 函数原型。
- int semctl(int semid, int semnum, int cmd,…/* union semun arg*/)
② 头文件。
- include <sys/types.h>
- include <sys/ipc.h>
③ 参数。
semid:要控制的信号量集合的标示符。
semnum:用于标识集合中的具体信号量。
cmd:指定了需执行的操作。
信号量参数枚举如下:
- union semun {
- int val; // SETVAL的值
- struct semid_ds *buf; // IPC_STAT, IPC_SET的缓冲
- unsigned short *array; // GETALL, SETALL的数值
- struct seminfo *__buf; // IPC_INFO的缓冲
- };
信号量集合结构体如下:
- struct semid_ds {
- struct ipc_perm sem_perm; // 权限
- time_t sem_otime; // 上次semop的时间
- time_t sem_ctime; // 上次修改的时间
- unsigned long sem_nsems; // 信号量集中信号量个数
- };
参数说明如下。
<1 常规控制操作.
加入下面参数进行操作都会忽略semnum参数。
IPC_RMID:立即删除信号量集及其关联的semid_ds数据结构。
IPC_STAT:在arg.buf指向的缓冲器中放置一份与这个信号量集相关联的semid_ds数据结构的副本。
IPC SET:使用arg.buf指向的缓冲器中的值来更新与这个信号量集相关联的semid_ds数据结构中选中的字段。
<2 获取和初始化信号量值。
下面的操作可以获取或初始化一个集合中的单个或所有信号量的值。获取一个信号量的值需具备在信号量上的读权限,而初始化该值则需要写权限。
GETVAL:semctl返回由semid指定的信号量集中第semmum个信号量的值。这个操作无需arg参数。
SETVAL:将由semid指定的信号量集中第semnum个信号量的值初始化arg.val。