<linux进程>system-V信号量的基本操作
来源:互联网 发布:ubuntu升级到16.04 编辑:程序博客网 时间:2024/05/20 07:35
system-V信号量机制有点古老,用于进程间:
一、写数据:
#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//semget()#include <sys/shm.h>#include <errno.h>union semun{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;};int main(int argc, char *argv[]){// 0.0 获取当前未用的IPC的keykey_t key_s = ftok(".", 1);// 用于信号量key_t key_m = ftok(".", 2);// 用于共享内存// 0.1 创建共享内存int shmid = shmget(key_m, 1024, IPC_CREAT|0644);// 0.2 映射共享内存char *shmaddr = shmat(shmid, NULL, 0);// 1 获取信号量idint semid = semget(key_s, 2, IPC_CREAT|IPC_EXCL|0644);if (semid == -1 && errno == EEXIST){semid = semget(key_s, 2, 0644);}else{// 2 初始化// 2.1 读操作初始化为0union semun sem_r;sem_r.val = 0;// 0表示信号量元素的值,也就是说读操作初始值为0semctl(semid, 0, SETVAL, sem_r);// 0表示初始化的是信号量第0个元素(读)// 2.2 写信号量初始化为1union semun sem_w;sem_w.val = 1;// 0表示信号量元素的值,也就是说写操作初始值为1semctl(semid, 1, SETVAL, sem_w);// 0表示初始化的是信号量第0个元素(写)}while (1){// 3 P操作,获取资源struct sembuf op_p[1];op_p[0].sem_num = 1;// 第0个信号量op_p[0].sem_op = -1;op_p[0].sem_flg = 0;semop(semid, op_p, 1);// 4 对资源进行访问,写数据进入printf("写入数据:");scanf("%s", shmaddr);// 5 V操作,释放资源,资源数+1struct sembuf op_v[1];op_v[0].sem_num = 0;// 第0个信号量op_v[0].sem_op = 1;op_v[0].sem_flg = 0;semop(semid, op_v, 1);}return 0;}
二、读数据:
#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//semget()#include <sys/shm.h>#include <errno.h>union semun{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;};int main(int argc, char *argv[]){// 0.0 获取当前未用的IPC的keykey_t key_s = ftok(".", 1);// 用于信号量key_t key_m = ftok(".", 2);// 用于共享内存// 0.1 创建共享内存int shmid = shmget(key_m, 1024, IPC_CREAT|0644);// 0.2 映射共享内存char *shmaddr = shmat(shmid, NULL, 0);// 1 获取信号量idint semid = semget(key_s, 2, IPC_CREAT|IPC_EXCL|0644);/* ===== 初始化时判断有没有被其它进程初始化过========== */if (semid == -1 && errno == EEXIST){semid = semget(key_s, 2, 0644);}else{// 2 初始化// 2.1 读操作初始化为0union semun sem_r;sem_r.val = 0;// 0表示信号量元素的值,也就是说读操作初始值为0semctl(semid, 0, SETVAL, sem_r);// 0表示初始化的是信号量第0个元素(读)// 2.2 写信号量初始化为1union semun sem_w;sem_w.val = 1;// 0表示信号量元素的值,也就是说写操作初始值为1semctl(semid, 1, SETVAL, sem_w);// 0表示初始化的是信号量第0个元素(写)}/* ======================= end ================== */while (1){// 3 P操作,获取写资源struct sembuf op_p[1];op_p[0].sem_num = 0;// 第0个信号量op_p[0].sem_op = -1;op_p[0].sem_flg = 0;semop(semid, op_p, 1);// 4 对资源进行访问,读数据printf("读到的数据:%s\n", shmaddr);// 5 V操作,释放读资源,资源数-1struct sembuf op_v[1];op_v[0].sem_num = 1;// 第0个信号量op_v[0].sem_op = 1;op_v[0].sem_flg = 0;semop(semid, op_v, 1);}return 0;}
阅读全文
0 0
- <linux进程>system-V信号量的基本操作
- Linux进程间通信(IPC)编程实践(九)System V信号量---封装一个信号量操作的工具集
- Linux进程同步之System V 信号量
- linux进程通信之SYSTEM V信号量
- Linux进程同步之System V 信号量
- Linux System V 信号量
- Linux进程间通信(IPC)编程实践(十)System V信号量---PV操作经典题目
- linux system V 信号量的初步理解
- System V 信号量操作,进程间通信(…
- System V 信号量操作,进程间通信(…
- Linux 进程通信(System V) 第四节 ------>信号量
- [linux系统编程]System V IPC 信号量做进程间互斥
- linux进程间通讯-System V IPC 信号量
- Linux程序设计学习笔记----System V进程间通信(信号量)
- Linux ipc------System V信号量
- Linux 信号量(system V)
- 用system V信号量实现进程同步的例子
- Linux System V信号量&POSIX信号量区别
- python中的with语句
- Vue2 访问父级数据this.$parent 修改插值语法delimiters
- JUnit 5 快速上手(从 JUnit 4 到 JUnit 5)
- Java中自定义异常类_异常处理
- css colum 列设置
- <linux进程>system-V信号量的基本操作
- ios中将JSValue类型转成NSString的方法
- iOS 多线程开发(一)
- Faster-RCNN_TF代码解读2:datasets/factory.py
- drawerlayout布局代码
- 微信一直报invalid signature错误解决
- 关于控制欲
- Git学习笔记---从远程库克隆
- Code signing is requires for product type 'Application' in SDK 'iOS 10.3'