linux ipc 信号量,linux ipc信号量
ipcs 命令,可以看到当前系统上的共享资源实例
ipcrm 命令,可以删除一个共享资源实例
linux 操作信号量的函数有三个:semget, semop, semctl
semget 声明为:
#include #include#include
int semget(key_t key, int nsems, int semflg);
key 是一个键值,用来标识一个全局唯一的信号量集。要通过信号量通信的进程需要使用相同的键值来获取该信号量。
nsems 表示要创建/获取的信号量集中信号量的数目。如果是创建信号量,这个值必须指定。如果是获取已经存在的信号量,可以把它设置成0.
semflg 指定一组标志。它的低端9个比特是该信号量的权限。相当于文件操作权限,类似open函数的mode参数。而且,它还可以和IPC_CREAT标志按位“或”运算来创建新的信号量集。
成功返回一个正整数,它是信号量集的标识符;失败返回-1,并设置errno
semop 系统调用改变信号量的值,即执行P、V操作:
int semop(int semid, struct sembuf *sops, size_t nsops);
semid 是由 semget 返回的信号量集标识符,用来指定被操作的目标信号量集。
sops 是 struct sembug 结构体,定义为:
/*Structure used for argument to `semop' to describe operations.*/
structsembuf
{
unsignedshort int sem_num; /*semaphore number*/
short int sem_op; /*semaphore operation*/
short int sem_flg; /*operation flag*/};
sem_num 是信号量集的编号,0表示第一个信号量。
sem_op 指定操作类型,可选值为正整数、0、负整数。
sem_flg 可选值是 IPC_NOWAIT, SEM_UNDO。IPC_NOWAIT指,无论信号量集操作是否成功,semop调用都立刻返回。SEM_UNDO含义是,当进程退出时,取消正在进行的semop操作
nsops参数指定要执行的操作个数,即sops数组中元素的个数。semop对数组sops中的每个元素按照数组顺序依次执行操作,并且这个过程是原子操作。
semop成功返回0,失败返回-1并设置errno。失败的时候,sops数组中指定的所有操作都不执行。
semctl用来对信号量进行直接操作:
int semctl(int semid, int semnum, int cmd, ...);
semid 是semget调用返回的信号量集标识符。semnum指定被操作的信号量在信号量集中的编号。cmd指定要执行的命令。有的命令需要传入第4个参数,这个参数类型由用户定义,但是,内核给出了它的格式,而且,必须是这个格式:
union semun {int val; /*Value for SETVAL*/
struct semid_ds *buf; /*Buffer for IPC_STAT, IPC_SET*/unsignedshort *array; /*Array for GETALL, SETALL*/
struct seminfo *__buf; /*Buffer for IPC_INFO
(Linux-specific)*/};
cmd 的值比较多,不列举了,可以看manpage,其中,
IPC_STAT 将信号量集关联的内核数据结构复制到semun.buf中,
GETVAL 获取信号量的semval的值
SETVAL 将信号量的semval值设置为semun.val
IPC_RMID 立即移除信号量集,唤醒所有等待信号量集的进程
该函数返回值根据cmd不同而不同。失败返回-1,并设置errno
semget函数第一个参数key可以设置为 IPC_PRIVATE(值为0),这样,无论信号量是否存在,都会创建一个新的信号量
#include #include#include#include#include#include#include
//这个联合体需要手动定义
union semun
{int val; /*Value for SETVAL*/
struct semid_ds *buf; /*Buffer for IPC_STAT, IPC_SET*/unsignedshort *array; /*Array for GETALL, SETALL*/
struct seminfo *__buf; /*Buffer for IPC_INFO
(Linux-specific)*/};void ErrExit(const char*reason)
{
fprintf(stderr,"%s: %d, %s\n", reason, errno, strerror(errno));
exit(1);
}int initsem(int key = 0)
{int semid = -1;if (-1 == (semid = semget(key, 1, 0666 |IPC_CREAT)))
{
ErrExit("semget");
}//信号量初始值为1
union semun sem_un;
sem_un.val= 1;if (-1 == semctl(semid, 0, SETVAL, sem_un))
{
ErrExit("semctl");
}returnsemid;
}void destroysem(intsemid)
{if (-1 == semctl(semid, 0, IPC_RMID))
{
ErrExit("semctl del");
}
}//-1 为 p 操作
void P(intsemid)
{structsembuf op;
op.sem_num= 0;
op.sem_op= -1;
op.sem_flg=SEM_UNDO;if (-1 == semop(semid, &op, 1))
{
ErrExit("semop p");
}
}//1 为 v 操作
void V(intsemid)
{structsembuf op;
op.sem_num= 0;
op.sem_op= 1;
op.sem_flg=SEM_UNDO;if (-1 == semop(semid, &op, 1))
{
ErrExit("semop v");
}
}int main(int argc, char const *argv[])
{int semid =initsem();
pid_t pid=fork();if (pid > 0)
{
P(semid);
printf("in parent process...\n");
sleep(1);
V(semid);
waitpid(pid, NULL,0);//删除信号量集
destroysem(semid);
}else if (0 ==pid)
{
P(semid);
printf("in child process...\n");
sleep(1);
V(semid);
}else{
ErrExit("fork");
}return 0;
}
linux ipc 信号量,linux ipc信号量相关推荐
- Linux IPC进程间通信(三):信号量
系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...
- Linux进程通信中IPC对象——IPC_PRIVATE与ftok
在linux中,可以使用IPC对象来进行进程间通信.IPC对象存在于内核中,多进程可以操作同一个IPC对象.每个IPC对象都有一个唯一的编号,该编号是由系统分配的.那么不同的进程如何知道这个编号,进而 ...
- linux进程间通信:system V 信号量 生产者和消费者模型编程案例
生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...
- linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
[摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...
- Linux进程间通信三 System V 信号量简介与示例
1. System V信号量简介 SystemV信号量主要用于解决生产者和消费者问题,一个信号量能够控制多个资源,说它是信号量集也不为过. 2. API接口介绍 2.1 创建或打开信号量集 #incl ...
- Linux信号量之内核信号量
一.内核信号量 Linux内核的信号量在概念和原理上与用户态的System V的IPC机制信号量是一样的,但是它绝不可能在内核之外使用,它是一种睡眠锁. 如果有一个任务想要获得已经被占用的信号量时,信 ...
- Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
<semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...
- 信号量 Linux函数 semget();semctl();semop();
Linux进程通信之信号量 信号量(semaphore)是变量,是一种特殊的变量.它紧取正值.对信息号量的操作只有2中: 等待(wait)和发送信号(signal). 信号量比较难理解.下面我们一个个 ...
- Linux 3.进程间通信(IPC)(pipe 无名管道、mkfifo 有名管道、ftok、msgget、msgrcv、msgsnd、msgctl 消息队列)
Linux 3.进程间通信(IPC) 进程间通信: 进程间方式: pipe 管道(无名管道) 头文件及原型 特点 pipe 示例 FIFO(有名管道) 管道文件的创建 mkfifo 头文件及原型 mk ...
- linux下清理信号量,Linux下进程间通信方式——信号量(Semaphore)
1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...
最新文章
- 8种最有可能在2016年倒闭的光伏企业
- python keyboard模块_python3 安装 pykeyboard 模拟浏览器
- GlusterFS架构与维护
- WeihanLi.Npoi 近期更新
- oracle数据库文件dbf复制#ocp试验#
- 服务器做raid bios界面做raid配置
- BetterScroll、移动端、滚动事件,如何使用
- 一文详解深度相机之TOF成像
- 如何落地用户画像分析?
- nfc修改饭卡软件下载_手机nfc模拟门禁卡app-NFC卡模拟软件中文版下载安卓标准版-西西软件下载...
- WordPress教程 – WordPress新手指南(2021)
- 工作之RF功能开发入门
- 编辑为什么建议转投_论文被退稿建议转投他刊是什么意思?
- IDEA加载文件:系统找不到指定文件
- 姜小白的Python日记Day9 变量与递归
- 星星之火-28:什么是CDMA的远近效应与功率控制?
- Python 斐波那契数
- 安全合规/GDPR--27--我们通过了GDPR合规认证
- VB.NET中LISTVIEW控件点击列首排序问题
- QQ名称花体英文(可复制)