并行Shell脚本检查Linux的互斥信号量

1)Linux下互斥信号量的作用

互斥信号量主要是用于访问共享资源时保证操作的原子性,即为一个整体的动作不允许被打断。

2)Linux下的文件操作函数的学习方式

man命令学习函数使用,写一个小代码,将函数用起来。

下面就带大家学习下互斥信号量相关的函数,然后用代码将这些函数串联起来,并用并行脚本进行一下验证。

2 Linux下互斥信号量相关的函数

1)ftok函数

ftok函数用于构造键值。

① 函数原型。


  1. key_t ftok( char * fname, int id ) 

② 头文件。


  1. include <sys/types.h>   
  2.  
  3. include <sys/ipc.h>  

③ 参数。

fname:文件名在内核中的一种数字表示。

id:项目id号。

键值有fname和项目id号组合产生。

④ 返回值。

成功:返回产生的键值。

失败:-1。

2)semget函数

semget函数用于创建打开信号量。

① 函数原型。


  1. int semget(key_t key,int nsems,int semflg) 

获取信号量集合的标示符。

当key所指定的信号量不存在的时候,并且semflg里包含了IPC_CREAT,这个时候,就会创建一个信号量集。

② 头文件。


  1. include <sys/types.h>   
  2.  
  3. include <sys/ipc.h>  
  4.  
  5. include <sys/sem.h>  

③ 参数。

key:键值。

semflay:标志,可以去IPC_CREAT,对应键值的信号量如果不存在还可以创建信号量。

nsems:创建的这个信号量集合里面包含的信号量数目。

④ 返回值。

成功:返回信号量集合的标示符。

失败:-1。

3)semctl函数

semctl函数在一个信号量集或集合中的单个信号量上执行各种控制操作。

① 函数原型。


  1. int semctl(int semid, int semnum, int cmd,…/* union semun arg*/) 

② 头文件。


  1. include <sys/types.h>   
  2.  
  3. include <sys/ipc.h>  

③ 参数。

semid:要控制的信号量集合的标示符。

semnum:用于标识集合中的具体信号量。

cmd:指定了需执行的操作。

信号量参数枚举如下:


  1. union semun { 
  2.  
  3.      int   val;                 // SETVAL的值 
  4.      struct semid_ds *buf;      // IPC_STAT, IPC_SET的缓冲 
  5.      unsigned short  *array;    // GETALL, SETALL的数值 
  6.      struct seminfo  *__buf;    // IPC_INFO的缓冲 
  7.  
  8. }; 

信号量集合结构体如下:


  1. struct semid_ds { 
  2.  
  3.     struct ipc_perm sem_perm;   // 权限  
  4.     time_t          sem_otime;  // 上次semop的时间 
  5.     time_t          sem_ctime;  // 上次修改的时间 
  6.     unsigned long   sem_nsems;  // 信号量集中信号量个数 
  7. }; 

参数说明如下。

<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。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章