代码如下所示,两边对照查看程序!(左图为先运行进程 右图为后运行进程)

  

运行的效果就是:当左边的进程检测到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操作的更多相关文章

  1. 20155202 张旭 课下作业: Linux下IPC机制

    20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...

  2. 20155239吕宇轩 Linux下IPC机制

    20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...

  3. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

  4. 详解Linux下iptables中的DNAT与SNAT设置(转)

    详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下   原文连 ...

  5. Linux 下的 netfilter 认识与常规操作

    Linux 下的 netfilter 认识与常规操作 前言 博客写到今天,1年7个月.可是包含所有写作经历,这个时间线可以达到三年. 上次更新了一篇 "镇站之宝" ,也是本站阅读量 ...

  6. dos2unix,去掉Linux下文件中的^M

    Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一 ...

  7. 将自己的SpringBoot应用打包发布到Linux下Docker中

    目录 将自己的SpringBoot应用打包发布到Linux下Docker中 1. 环境介绍 2. 开始前的准备 2.1 开启docker远程连接 2.2 新建SpringBoot项目 3. 开始构建我 ...

  8. Linux下Oracle中SqlPlus时上下左右键乱码问题的解决办法

    window下的sqlplus可以通过箭头键,来回看历史命令,用起来非常的方便. 但是在Linux下,会出现各种乱码,非常不方便,如下图所示,每次打错一个字符就需要重新打一遍. 解决办法:rlwrap ...

  9. [转] 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 ...

随机推荐

  1. [九省联考2018]秘密袭击coat

    [九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)

    https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...

  3. CSS 书写规范

    class 类名的命名应该以功能为依据: 例如: .btn-danger;  .btn-warning CSS组件 一个组件==一个独立的功能模块 针对一个组件,通过功能描述样式   组件命名,功能描 ...

  4. 【搞事情】VS2015下的openGL初始化

    环境:glfw+glew+visual studio 2015 原材料下载链接: glfw 下载 glew 下载 glm库 下载 cmake 下载 (我下载的时候有些官网戳不开(大概校园网问题)... ...

  5. 全卷积网络 FCN 详解

    背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题.神经网络大神Jonathan Long发表了<Fully Convolutional N ...

  6. 更改 Ubuntu默认Python版本的问题

    一般Ubuntu默认版本为2.x,之前运行一些程序,将默认版本修改为3.5,现在想修改为2.7. 之前的方法有些忘记,现在重新记录一下: 1.查看你系统中有哪些Python的二进制文件可供使用, ls ...

  7. CapsNet胶囊网络(理解)

    0 - 背景 Geoffrey Hinton是深度学习的开创者之一,反向传播等神经网络经典算法发明人,他在去年年底和他的团队发表了两篇论文,介绍了一种全新的神经网络,这种网络基于一种称为胶囊(caps ...

  8. python Flask web框架

    目录: --> Flask --> 配置文件 --> 配置文件解析 --> 配置文件导入 --> 路由 --> 路由参数 --> 常用路由匹配 --> ...

  9. Django之验证码

    一.自己生成验证码 二.极验科技互动验证码 使用前步骤:下载官网文件——pip install geetest——引入其封装的js模块 代码分为三段:生成验证码——显示验证码——验证验证码. from ...

  10. NB-IoT不一定最完美 但足以成为决定ofo与摩拜物联网胜负的关键【转】

    转自:http://news.rfidworld.com.cn/2017_11/3d5ed5c5d8cb9949.html 2018年到来之前,如果还不懂物联网,你会被淘汰. 今年1月,工信部< ...