Linux 各类信号量详解

发布时间 - 2017-06-21 00:00:00    点击率:

定义:保护共享资源,使得资源在一个时刻只有一个进程(线程)拥有

原理:信号量值为正时说明空闲,若为0或负值则说明被占用

分类:内核信号量与用户信号量,用户信号量分为POXIS信号量和SYSTEMV信号量,POXIS信号量分为有名信号量和无名信号量

内核信号量:

  • #include

  • void sema_init(struct semaphore *sem, int val);

  • void init_MUTEX(struct semaphore *sem); //初始值1

  • void init_MUTEX_LOCKED(struct semaphore *sem); //初始值0

  • void down(struct semaphore *sem); //可睡眠

  • int down_interruptible(struct semaphore *sem); //可中断

  • int down_trylock(struct semaphore *sem); //m非阻塞

  • void up(struct semaphore *sem);

SYSTEMV信号量:

  • #include

  • int semget(key_t key, int nsems, int oflag);

  • int semop(int semid, struct sembuf *opsptr, size_t nops);

  • int semctl(int semid, int semum, int cmd,...);

POSIX无名信号量

  • #include

  • sem_t sem;

  • int sem_init(sem_t *sem, int pshared, unsigned int val); //pshared为0则线程间共享,pshared为1则父子进程共享

  • int sem_wait(sem_t *sem); //阻塞

  • int sem_trywait(sem_t *sem); //非阻塞

  • int sem_post(sem_t *sem);

  • int sem_destroy(sem_t *sem);

  • 进程间共享则sem必须放在共享内存区域(mmap, shm_open, shmget),父进程的全局变量、堆、栈中存储是不行的

POSIX有名信号量

  • sem_t *sem_open(const char *name, int oflag, mode_t mode, int val);

  • int sem_wait(sem_t *sem);

  • int sem_trywait(sem_t *sem);

  • int sem_post(sem_t *sem);

  • int sem_close(sem_t *sem);

  • int sem_unlink(const char *name);

  • 每个open的位置都要close和unlink,但只有最后执行的unlink生效


# linux  # 信号量  # 放在  # 都要  # 只有一个  # 值为  # 则说  # 若为  # 全局变量  # sys  # key_t 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何配置任务调度?(Cron Job示例)  如何挑选最适合建站的高性能VPS主机?  动图在线制作网站有哪些,滑动动图图集怎么做?  iOS发送验证码倒计时应用  太平洋网站制作公司,网络用语太平洋是什么意思?  如何用好域名打造高点击率的自主建站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  UC浏览器如何设置启动页 UC浏览器启动页设置方法  js实现点击每个li节点,都弹出其文本值及修改  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  电商网站制作价格怎么算,网上拍卖流程以及规则?  javascript基于原型链的继承及call和apply函数用法分析  如何快速搭建自助建站会员专属系统?  Laravel如何使用Blade组件和插槽?(Component代码示例)  什么是javascript作用域_全局和局部作用域有什么区别?  免费网站制作appp,免费制作app哪个平台好?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何在腾讯云服务器上快速搭建个人网站?  北京的网站制作公司有哪些,哪个视频网站最好?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Android滚轮选择时间控件使用详解  HTML 中动态设置元素 name 属性的正确语法详解  如何自定义建站之星网站的导航菜单样式?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Swift中swift中的switch 语句  韩国服务器如何优化跨境访问实现高效连接?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel如何使用Eloquent进行子查询  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何快速搭建高效WAP手机网站吸引移动用户?  如何在服务器上配置二级域名建站?