Linux下IPC中的信号量PV操作
代码如下所示,两边对照查看程序!(左图为先运行进程 右图为后运行进程)

运行的效果就是:当左边的进程检测到EOF,释放资源V操作之后,右边的进程会迅速的执行对应的printf的操作!
所有代码文件结构如下:

sem_a.c(左边进程的代码,编译方式:gcc sem_a.c sempv.c -o sem_a)
#include <stdio.h>
#include "sempv.h" int main(int *argc, char *argv[])
{
key_t my_key = ;
int my_sem; my_sem = Create_sem(my_key,,|IPC_CREAT);
printf("setting val...\n");
init_sem(my_sem,,); printf("p...\n");
P(my_sem);
while(getchar() != EOF);
V(my_sem); sleep();
del_sem(my_sem); return ;
}
sem_b.c(右边进程的代码,编译方式:gcc sem_b.c sempv.c -o sem_b)
#include<stdio.h>
#include "sempv.h" int main(int *argc, char *argv[])
{
key_t my_key = ;
int my_sem; my_sem = Link_sem(my_key,,); printf("p....\n");
P(my_sem);
printf("sem1 finished!\n");
V(my_sem); return ;
}
sempv.c(PV操作的源程序,对应函数的实现)
#include "sempv.h" //P操作,申请一个资源
void P(int semid)
{
struct sembuf my_buf;
memset(&my_buf,,sizeof(my_buf));
my_buf.sem_num = ;
my_buf.sem_op = -;
my_buf.sem_flg = SEM_UNDO;
semop(semid,&my_buf,);
} void V(int semid)
{
struct sembuf my_buf;
memset(&my_buf,,sizeof(my_buf));
my_buf.sem_num = ;
my_buf.sem_op = ;
my_buf.sem_flg = SEM_UNDO;
semop(semid,&my_buf,);
} int Create_sem(key_t key,int index,int op)
{
int sem;
sem = semget(key,index,op);
if(sem == -)
{
printf("semget error!\n");
exit();
}
return sem;
} int Link_sem(key_t key,int index,int op)
{
int sem;
sem = semget(key,index,op);
if(sem == -)
{
printf("semget error!\n");
exit();
}
return sem;
} void init_sem(int sem,int index,int val) // Provent the sem be lock at the begin of the program!
{
semctl(sem,index,SETVAL,val);
} void del_sem(int sem)
{
semctl(sem,,IPC_RMID);
}
sempv.h头文件声明
#ifndef __SEMPV_H__
#define __SEMPV_H__ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h> void P(int semid);
void V(int semid);
int Link_sem(key_t key,int index,int op);
int Create_sem(key_t key,int index,int op);
void init_sem(int sem,int index,int val);
void del_sem(int sem); #endif
结论:从上述分析中我们可以得知,目前PV操作的库sempv.h/sempv.c的使用步骤如下:


Linux下IPC中的信号量PV操作的更多相关文章
- 20155202 张旭 课下作业: Linux下IPC机制
20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...
- 20155239吕宇轩 Linux下IPC机制
20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...
- Linux下IPC机制
Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...
- 详解Linux下iptables中的DNAT与SNAT设置(转)
详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下 原文连 ...
- Linux 下的 netfilter 认识与常规操作
Linux 下的 netfilter 认识与常规操作 前言 博客写到今天,1年7个月.可是包含所有写作经历,这个时间线可以达到三年. 上次更新了一篇 "镇站之宝" ,也是本站阅读量 ...
- dos2unix,去掉Linux下文件中的^M
Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一 ...
- 将自己的SpringBoot应用打包发布到Linux下Docker中
目录 将自己的SpringBoot应用打包发布到Linux下Docker中 1. 环境介绍 2. 开始前的准备 2.1 开启docker远程连接 2.2 新建SpringBoot项目 3. 开始构建我 ...
- Linux下Oracle中SqlPlus时上下左右键乱码问题的解决办法
window下的sqlplus可以通过箭头键,来回看历史命令,用起来非常的方便. 但是在Linux下,会出现各种乱码,非常不方便,如下图所示,每次打错一个字符就需要重新打一遍. 解决办法:rlwrap ...
- [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
[From] https://www.zmrbk.com/post-2030.html https://blog.csdn.net/suifengshiyu/article/details/40952 ...
随机推荐
- [Nmap] Regular script
out of date: TCP:nmap.exe -sC -sS -sV -p 1-65535 -A -v -v -oX filename.xml ip UDP:nmap.exe -sC -sU - ...
- Java入门:基础算法之二进制转换为十进制
Java有两种方法可以将二进制数转换为十进制数: 1)使用Integer类的Integer.parseInt()方法. 2)自己编写转换逻辑. 方法1:使用Integer.parseInt()实现二进 ...
- crontab 误删恢复
某台服务器某账号的 crontab 任务被清空,原因不明.同时,该服务器上的 crontab 任务备份未开启.故思考如何恢复 crontab 任务. 经查,CentOS 系统的 crontab 任务的 ...
- 第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移
一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略: 1. CreateDatabaseIfNotExists:EF的默认策略,数据库不存在,生成数据库:一旦model发生变 ...
- table 表格固定表头和第一列、内容可滚动
整理了下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 大数据基础-2-Hadoop-1环境搭建测试
Hadoop环境搭建测试 1 安装软件 1.1 规划目录 /opt [root@host2 ~]# cd /opt [root@host2 opt]# mkdir java [root@host2 o ...
- Django之AJAX
一.预备知识JSON python中的json: json.dumps( ) json.loads( ) JavaScript中的json:JSON.stringify( ) J ...
- [Kubernetes]深入解析Pod对象
k8s集群搭建是比较容易的,但是我们为什么要搭建,里面涉及到的内容,我们为什么需要? 这篇文章就尝试来讲讲,我们为什么需要一个Pod,对Pod对象来一个深入解析. 我们为什么需要Pod 我们先来谈一个 ...
- 关于 min_25 筛的入门以及复杂度证明
min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...
- Windows密钥容器和证书的关系
其实CSP主要是对容器里的密钥对操作的,和证书关系不大. 容器里的密钥对有两种类型:一种是AT_KEYEXCHANGE,表示加密的密钥对,一种是AT_SIGNATURE表示签名的密钥对. 由于美国的出 ...