linux ipc信号量
ipcs 命令,可以看到当前系统上的共享资源实例
ipcrm 命令,可以删除一个共享资源实例
linux 操作信号量的函数有三个:semget, semop, semctl
semget 声明为:
#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>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. */ struct sembuf {unsigned short 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 */unsigned short *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 <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/wait.h> #include <sys/sem.h>//这个联合体需要手动定义 union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *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");}return semid; }void destroysem(int semid) {if (-1 == semctl(semid, 0, IPC_RMID)){ErrExit("semctl del");} }// -1 为 p 操作 void P(int semid) {struct sembuf 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(int semid) {struct sembuf 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; }
转载于:https://www.cnblogs.com/zuofaqi/p/9643787.html
linux ipc信号量相关推荐
- Linux IPC进程间通信(三):信号量
系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...
- linux c 信号量简介
信号量的分类 在学习 IPC 信号量之前,让我们先来了解一下 Linux 提供两类信号量: 内核信号量,由内核控制路径使用. 用户态进程使用的信号量,这种信号量又分为 POSIX 信号量和 Syste ...
- Unix/Linux IPC及线程间通信总结
一.互斥与同步 1.互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 2.同步:是指在互斥的基础上(大多数情况),通过其它 ...
- Linux 进程间通信 - 信号量
0. 前言 进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程 ...
- Linux IPC总结(全)
原文链接 IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法.Linux IPC基本上都是从Unix平台上继承而来的.主要包括最初的U ...
- Linux IPC shm
Linux IPC Shm Linux 共享内存 Linux 不同进程之间可以通过共享内存的方式完成通信. Linux 使用共享内存 共享内存相关API shmget shmget - allocat ...
- Linux系统信号量实现生产者-消费者问题
Linux系统信号量实现生产者-消费者问题 实现代码 #include<bits/stdc++.h> #include<unistd.h> #include<pthrea ...
- Linux操作系统-信号量
信号量也属于一种进程间通信的机制,与其他的进程间通信不同,信号量不是用来传输数据的,而是用来进程间同步与互斥.除此之外,信号量还可以实现线程间的互斥. 信号量是什么? 信号量的本质是一个计数器. 一个 ...
- Linux IPC实践(11) --System V信号量(1)
信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...
- Linux IPC 3 之 信号量
一 什么是信号量 二 信号量的分类 三 内核信号量 1 内核信号量的构成 2 内核信号量中的等待队列删除没有联系 3 内核信号量的相关函数 1 初始化 2 申请内核信号量所保护的资源 3 释放内核信号 ...
最新文章
- 最近公共祖先 LCA Tarjan算法
- BZOJ5102 POI2018Prawnicy(堆)
- LSTM 和 GRU
- panda python_12个很棒的Pandas和NumPy函数,让分析事半功倍
- EF CodeFirst下的自动迁移
- Session重点整理
- 96% 移动恶意软件针对 Android 系统:逾50亿应用可被攻击
- 华为怎么删除自带的音乐_华为手机独有的这个模式,让睡觉更舒畅
- 阿里巴巴JAVA开发手册----(二)异常日志
- arm架构安装rxtx_Ubuntu下安装和配置RXTX实现串口通讯
- 阿里巴巴大数据实践:大数据建设方法论OneData
- 通过关键词获取微博内容
- transformer 模型的decoder部分 带gif动图
- 测试用例设计-淘宝购物车,微信发红包
- matlab求三维图形表面积,基于MATLAB的不规则平面立体表面积计算
- 华为模拟器eNSP练习题-静态路由、缺省路由
- PS如何给白衬衫换色
- js输入框的联想功能
- 龟兔赛跑c语言程序设计题,模拟龟兔赛跑(很笨拙的代码)
- 解决phpstorm编辑html卡顿问题
热门文章
- smale学习之数学表达式(day5)
- 一个react项目案例01 组件部分
- mysql能将查询结果与表左查询,MySQL查询与结构
- 浙江省单考单招计算机提前招,2018浙江省各校高职提前招生简章汇总及深度解析...
- docker镜像打包
- python+grpc+yolo 目标检测实践
- Sublime Text SFTP 注册码
- 2021-06-23元素的排列,浮动和display
- java进账和转账需要锁吗,Spring与Java中的锁
- 机器学习 什么是Cross Entropy 交叉熵