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 讲的是有名信号量来实现共享内存读写数据的同步。
 

posted on   lydstory  阅读(1171)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示