linux -- System V 信号量集

2023-05-16

目录

    • 1、相关函数
      • 1.1、创建或引用信号量集: semget()
      • 1.2、对信号量的操作:semop()
      • 1.3、对信号量集的操作:semctl()

1、相关函数

  • 头文件
 #include <sys/types.h>
 #include <sys/ipc.h>
 #include <sys/sem.h>

1.1、创建或引用信号量集: semget()

int semget(key_t key, int nsems, int semflg);
  • key:创建信号量的键值
    可通过ftok产生,也可自定义
    0 或 IPC_PRIVATE :只能创建信号集,并且通过此值创建的信号集键值都为0
    非0:创建信号集 或 引用key对应的信号集
  • nsems:信号集中信号量的 个数
    创建时必须指明nsems
    引用时可以为0,表示不关心;或者大于0小于等于被引用的最大信号量数
  • semflg:信号集的权限
    IPC_CREAT:创建时使用,若key对应的信号集存在,则返回对应的semid
    IPC_EXCL:和IPC_CREAT搭配,若key对应的信号集存在则会报错
    0666;和IPC_CREAT搭配,指定信号集的权限
    0:单独使用,只能用来获取key对应的semid
  • 返回值
    > 0 信号量集的id(semid)
    -1 失败

创建信号量集时会初始化semid_ds结构体

1.2、对信号量的操作:semop()

int semop(int semid, struct sembuf *sops, size_t nsops);

struct sembuf{
 	 unsigned short sem_num;  /* semaphore number */
	 short          sem_op;   /* semaphore operation*/
	 short          sem_flg;  /* operation flags */
 };

semop:

  • semid:信号量集id
  • sops:指向信号量操作的数组
  • nsops:sops指向数组的大小
  • 返回值
    0 成功
    -1 失败

sembuf:

  • sem_num:要操作的信号量的编号(从0开始)
  • sem_flg:以怎样的方式操作信号量
    IPC_NOWAIT:不阻塞调用进程
    SEM_UNDO:在进程结束时取消响应的操作(这里不是很理解)
  • sem_op;对信号量的操作
    在这里插入图片描述

1.3、对信号量集的操作:semctl()

int semctl(int semid, int semnum, int cmd,...);
  • semid:信号量集id
  • semnum:要操作的信号量的编号
  • cmd:要执行的操作
  • :设置或返回信号量信息(以前的版本是union semun arg)

在这里插入图片描述

  • 返回值:
    失败: -1
    成功: 与cmd相关

在这里插入图片描述

union semun {
   //在目前的sem.h中该共用体被注释了
  int  val;    /* Value for SETVAL */
  struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
  unsigned short  *array;  /* Array for GETALL, SETALL */
  struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific) */
};
struct semid_ds {
   struct ipc_perm sem_perm;  /* Ownership and permissions */
   time_t          sem_otime; /* Last semop time */
   time_t          sem_ctime; /* Last change time */
   unsigned long   sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
   key_t          __key; /* Key supplied to semget(2) */
   uid_t          uid;   /* Effective UID of owner */
   gid_t          gid;   /* Effective GID of owner */
   uid_t          cuid;  /* Effective UID of creator */
   gid_t          cgid;  /* Effective GID of creator */
   unsigned short mode;  /* Permissions */
   unsigned short __seq; /* Sequence number */
 };
struct  seminfo {
   int semmap;  /* Number of entries in semaphore map; unused within kernel */
   int semmni;  /* Maximum number of semaphore sets */
   int semmns;  /* Maximum number of semaphores in all semaphore sets */
   int semmnu;  /* System-wide maximum number of undo structures; unused within kernel */
   int semmsl;  /* Maximum number of semaphores in a set */
   int semopm;  /* Maximum number of operations for semop(2) */
   int semume;  /* Maximum number of undo entries per process; unused within kernel */
   int semusz;  /* Size of struct sem_undo */
   int semvmx;  /* Maximum semaphore value */
   int semaem;  /* Max. value that can be recorded for semaphore adjustment (SEM_UNDO) */
 };

只是简单介绍了信号量的相关api,目前还没找到一个相对好的测试代码
参考: man手册、mooc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux -- System V 信号量集 的相关文章

随机推荐