Linux信号量常用操作表

2023-05-16

以下函数失败时均返回-1,所在头文件为#include<sys/sem.h>

创建用于区分信号量的键值key:key_t key = ftok("/foo/bar/", 'a'),第一个参数为任意路径,第二个参数为任意8位的字符。如果设定的路径为当前目录“.”,则生成的key与控制台当前所在的目录(pwd)有关,与程序所在的目录无关

创建一个信号量集:int sem = semget(key, 信号量集中欲创建的信号量的个数, 权限 | IPC_CREAT) ,失败时返回-1,权限可以是八进制的0666(mode_t位于头文件fcntl.h中)。若指定IPC_EXCL(inter-process communication, exclude)选项,则信号量集已存在时会失败。权限值还可以用一组系统标识符(system identifier)来表示,例如0644= 420 = 0x1a4可以表示为S_IRUSR| S_IWUSR | S_IRGRP | S_IROTH,标识符所在的头文件为<fcntl.h>

[oct1158@oct1158-fedora sem2]$ grep S_IRGRP -Inrw /usr/include
/usr/include/fcntl.h:111:# define S_IRGRP	(S_IRUSR >> 3)  /* Read by group.  */
/usr/include/fcntl.h:117:# define S_IROTH	(S_IRGRP >> 3)  /* Read by others.  */
/usr/include/sys/stat.h:180:#define	S_IRGRP	(S_IRUSR >> 3)	/* Read by group.  */
/usr/include/sys/stat.h:186:#define	S_IROTH	(S_IRGRP >> 3)	/* Read by others.  */
/usr/include/sys/stat.h:197:# define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666*/
/usr/include/linux/stat.h:35:#define S_IRGRP 00040
[oct1158@oct1158-fedora sem2]$ grep "mode_t;" -Inrw /usr/include
/usr/include/fcntl.h:50:typedef __mode_t mode_t;
/usr/include/sys/types.h:70:typedef __mode_t mode_t;
/usr/include/sys/mman.h:37:typedef __mode_t mode_t;
/usr/include/sys/ipc.h:38:typedef __mode_t mode_t;
/usr/include/sys/stat.h:59:typedef __mode_t mode_t;
[oct1158@oct1158-fedora sem2]$ 

获取信号量集:int sem = semget(key, 0, 0)

获取单个信号量的值:semctl(信号量集, 信号量编号, GETVAL),第一个参数就是上面的sem,信号量编号是从0开始的

设置单个信号量的值:semctl(信号量集, 信号量编号, SETVAL, 值)

获取信号量集中的信号量个数:struct semid_ds ds;    semctl(信号量集, 0, IPC_STAT, &ds);    int count = ds.sem_nsems,加粗的参数为无效参数,函数执行时将会被忽略掉

获取信号量集中所有信号量的值:semctl(信号量集, 0, GETALL, list),其中list的类型为unsigned short *,必须用malloc分配足够的空间:list= (unsigned short *)malloc(ds.sem_nsems * sizeof(unsigned short)),输出时printf要用%hd

设置信号量集中所有信号量的值:semctl(信号量集, 0, SETALL, list)

获取正在等待某个信号量有足够资源的进程数:semctl(信号量集, 信号量编号, GETNCNT)

获取正在等待某个信号量为0的进程数:semctl(信号量集, 信号量编号, GETZCNT)

删除信号量集:semctl(信号量集, 0, IPC_RMID),同时唤醒所有等待的进程

获取最后一次对某一个信号量执行semop函数的进程号:semctl(信号量集, 信号量编号, GETPID)

 

PV操作函数:

struct sembuf buf;

semop(信号量集,&buf, 1); // 操作单个信号量

struct sembuf buf[4];

semop(信号量集,buf, 4); // 操作4个信号量

参数buf的结构体成员:

buf.sem_num = 0; // 要操作或等待的信号量编号(unsigned short),输出格式为%hu

buf.sem_op = -10; // 要获取(负数)或释放(正数)的资源数,输出格式为%hd

buf.sem_flg = 0; // 附加参数,输出格式为0x%04x

当sem_op为负时,若资源数不够,则会阻塞

当sem_op为0时,且信号量的值不为0时阻塞,直到信号量的值为0

若指明附加参数sem_flg=IPC_NOWAIT,则该阻塞时不阻塞,函数立即返回-1(获取资源失败)

若指明附加参数sem_flg=SEM_UNDO,则进程结束时系统自动加回未释放的资源数。

两个附加参数可以同时使用:sem_flg= IPC_NOWAIT | SEM_UNDO

 

AND型信号量:

struct sembuf buf[2];

buf[0].sem_ num = 1; buf[0].sem_op = -4; buf[0].sem_flg = 0;

buf[1].sem_num = 2; buf[1].sem_op = -10; buf[1].sem_flg = 0;

semop(sem, buf, 2);

只有当信号量1的值>=4,且信号量2的值>=10,进程才不会阻塞

 

struct sembuf结构体的定义如下:


注意:最新的Linux系统里面没有union semun联合体!实际编程时也不需要使用这个联合体类型。



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

Linux信号量常用操作表 的相关文章

随机推荐

  • arecord用法及其含义

    1 命令格式 arecord flags filename 2 选项含义 h xff0c help 帮助 xff09 V xff0c version 打印版本信息 xff09 l xff0c list devices 列出全部声卡和数字音频
  • arduino Windows7 64位下驱动安装失败解决办法

    Arduino在64位Windows7操作系统下驱动安装失败 操作系统环境 xff1a 64位 win7 旗舰版 失败现象 xff1a INF段落无效 驱动不适用该平台等 解决办法 xff1a 1 找到C Windows inf setup
  • WinRAR分析

    1 xff0e 样本概况 1 1 应用程序信息 应用程序名称 xff1a WinRAR 6 11 0 MD5值 xff1a F2BD2E3D8B7C7C8EEFA2B28E3280EDA3 SHA1值 xff1a DC2B378B27D1A
  • 树莓派搭建代理服务器(基于Squid)

    第一步 xff1a https blog csdn net bql email article details 79147250 第二个 xff1a 要使用Proxifier等软件 sudo gedit etc squid squid co
  • Nginx 使用naxsi 防xss、防注入攻击配置

    61 61 对于nginx有相应模块来完成WAF构建 xff0c 此处使用的是naxsi模块 61 61 Naxsi是一个开放源代码 高效 低维护规则的Nginx web应用防火墙模块 Naxsi的主要目标是帮助人们加固他们的web应用程序
  • pytorch 把tensor转换成int

    直接在tensor变量的后面加 item xff0c 就能把tensor类型转换成int类型 xff0c 我也不知道为什么 xff0c 试了别的都不行 准确的说是把Tensor 转化成Python scales
  • 最新软件设计师知识点分析(思维导图)

    大家好 xff0c 作为一个考取软件设计师的过来人 xff0c 今天我给大家分享一下关于软件设计师考题的复习经验 1 多做多分析多总结近年来习题 xff08 达到看到题就知道考点是什么怎么解 xff09 2 知道怎么在题中怎么找答案 3 梳
  • 记一次阿里云服务器被攻击导致无法ssh登陆(root也不行)

    服务器被攻击导致无法ssh 博主早上登陆准备做一些骚操作 xff0c 结果突然发现ssh不上服务器 xff0c 并且收到短信说服务器被挖矿病毒攻击 xff0c 然后服务器就斯密达了 xff0c 发现报错如下 xff1a Permission
  • Python geometry_msgs.msg.PoseStamped() Examples

    https www programcreek com python example 70252 geometry msgs msg PoseStamped
  • github 下载历史版本的代码

    操作如下所示 xff1a 根据历史commit xff0c 找到历史版本 xff0c 然后下载
  • 欢迎使用CSDN-markdown编辑器

    转 Eclipse下tomcat输出路径配置 标签 xff1a tomcateclipseserverpath 2012 07 12 16 09 7256人阅读 评论 0 收藏 举报 分类 xff1a eclipse tomcat xff0
  • 那根你想顺着去打人的网线是怎么制作的?

    更多精彩关注微信公众号 xff1a 信息技术员 现代社会大家都很浮躁 xff0c 总有人嚷嚷着要顺着网线去打人 xff0c 也不问问自己会做网线么 xff1f 本文手把手教你怎么制作一根网线 一 准备工作 1 网线一根 2 网线钳一把 3
  • Linux下动态库使用小结

    1 xff0e 静态库和动态库的基本概念 静态库 xff0c 是在可执行程序连接时就已经加入到执行码中 xff0c 在物理上成为执行程序的一部分 xff1b 使用静态库编译的程序运行时无需该库文件支持 xff0c 哪里都可以用 xff0c
  • 傻瓜式教学——手把手教你电脑三种方式连接打印机

    如何判断打印机和电脑的连接方式 xff1f 电脑连接打印机有三种方式情况 xff0c 一是通过USB直连 xff0c 二是通过网络连接 xff0c 三是通过共享连接 可通过下面方法判断连接方式 如果通过 口和电脑连接 xff0c 则是USB
  • 服务器为什么能够稳定可靠运行?

    前几天github服务器故障 xff0c 传言服务器被偷走一度上了热搜 xff0c 后证实传言是P图 xff08 下图为假 xff09 但确实每次大型互联网公司服务器故障都引发了人们的广泛讨论 其中还有不少上了热搜 那么服务器到底是何方神圣
  • Yanmar(洋马)发动机SPN-FMI代码在仪表显示

    分享一个自己在仪表上显示洋马发动机SPN FMI代码过程的记录 1 问 xff1a SPN和FMI什么意思 xff1f 答 xff1a 见SAE J1939 73 5 6 诊断故障码定义 诊断故障代码 xff08 DTC xff09 由4
  • APM调试,地面站随手记

    最近随公司调试4轴和8轴APM多旋翼 xff0c 本文将心得记录下来 xff0c 以备自己和他人查阅 xff0c 水平有限 xff0c 如有错误 xff0c 请不吝赐教 本文不定期更新 xff0c 转载请注明出处 2016 9 8 一 自检
  • 解决同一局域网下不同网段能ping通但是ssh不上服务器的情况

    一 xff1a 问题描述 xff1a 在公司的局域网网络环境下有四个ip网段 xff0c 分别是192 168 1 0 2 0 3 0 5 0 xff0c 服务器用的是5 0网段的 xff0c 而个人电脑用的则是1 0网段的 xff0c 在
  • STM32单片机电源端并联电容的重要性

    如图 xff0c 笔者用TQFP 32 100PIN 0 55MM转直插的转接板焊了一个STM32F207VET6的板子 板上引出了SWD调试接口 xff08 仅占用PA13和PA14 xff09 xff0c USART1串口引脚 xff0
  • Linux信号量常用操作表

    以下函数失败时均返回 1 xff0c 所在头文件为 include lt sys sem h gt 创建用于区分信号量的键值key xff1a key t key 61 ftok 34 foo bar 34 39 a 39 xff0c 第一