linux IPC --- 有名信号量详解
【转】https://blog.csdn.net/u014530704/article/details/77387536
在之前的博客中linux信号量—互斥与同步谈到无名信号量。无名信号量主要用于线程间的通信,保存在内存中,如果想要在进程间同步就必须把无名信号量放在进程间的共享内存中。而在进程间的通信中同步用的通常是有名信号量。有名信号量一般保存在/dev/shm/ 目录下。像文件一样存储在文件系统中。
无名信号量的操作主要涉及到以下六个函数:
sem_init 用于创建一个信号量,并能初始化它的值。
sem_wait 和 sem_trywait 相当于 P 操作,它们都能将信号量的值减一,两者的区别在于若信号量小于零时,sem_wait 将会阻塞进程,而 sem_trywait 则会立即返回。
sem_post 相当于 V 操作,它将信号量的值加一同时发出信号唤醒等待的进程。
sem_getvalue 获取信号量的值。
sem_destroy 删除信号量
有名信号量和无名信号量的区别和联系:
无名信号量的创建信号量函数是sem_init,有名信号量的则是sem_open函数。
无名信号量的删除信号量函数是sem_destroy,有名信号量的则是用sem_close函数关闭有名信号量,但是想要把信号量从文件系统删除得用sem_unlink函数。
其他的PV操作有名信号量是完全和无名信号量一致的。
我们主要来看看有名信号量独特于无名信号量的函数,公共函数就不详细叙述了,请参考博文linux信号量—互斥与同步
sem_open函数
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);//打开一个有名信号量,此时有名信号量是已经存在了的。
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);//创建有名信号量
返回值:若成功,返回信号量的地址;若出错,返回SEM_FAILED
参数:
name:信号量文件名。
flags:sem_open() 函数的行为标志。
mode:文件权限,可用八进制表示,如0777.
value:信号量初始值。
sem_close函数
#include <semaphore.h>
int sem_close(sem_t *sem);//关闭有名信号量
返回值:若成功,返回0;若出错,返回-1
参数:
sem:指向信号量的指针。
sem_unlink函数
#include <semaphore.h>
int sem_unlink(const char *name);//删除有名信号量文件
返回值:若成功,返回0;若出错,返回-1
参数:
name:有名信号量文件名。
下文通过6个测试程序,解析有名信号量的各种运用场景:
name_sem.c 讲的是有名信号量实现亲缘进程间互斥功能。
sync_name_sem.c 讲的是有名信号量实现亲缘进程间同步功能。
NameSemWrite_1.c 和 NameSemWrite_2.c 讲的是在两个不同的程序测试有名信号量的同步功能。
share_memory_name_sem_1.c 和 share_memory_name_sem_2.c 讲的是有名信号量来实现共享内存读写数据的同步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了