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

  

运行的效果就是:当左边的进程检测到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. [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

    题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...

  2. mysql ssh 跳板机(堡垒机???)连接服务器

    跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是系统管理员或运维人员常用的操作平台之一. 正常的登录流程 使用ssh命令登录跳板机: 登录跳板机成功后,在跳 ...

  3. pymongo 使用方法(增删改查)

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ MongoDB存储 在这里我们来看一下Python3下MongoDB的存 ...

  4. Python爬虫之一

    1. 爬虫的选取:scrapy和requests+beautifuisoup scrapy是框架,而requests和beautifulsoup是库.scrapy框架是可以加如requests和bea ...

  5. A Graph Partitioning Game Theoretical Approach for the VNF Service Chaining Problem

    文章名称:A Graph Partitioning Game Theoretical Approach for the VNF Service Chaining Problem 发表时间:2017 期 ...

  6. go 的包

  7. 第四节:跨域请求的解决方案和WebApi特有的处理方式

    一. 简介 前言: 跨域问题发生在Javascript发起Ajax调用,其根本原因是因为浏览器对于这种请求,所给予的权限是较低的,通常只允许调用本域中的资源, 除非目标服务器明确地告知它允许跨域调用. ...

  8. [Android] Android 锁屏实现与总结 (二)

    上接: [Android] Android 锁屏实现与总结 (一) 系列文章链接如下: [Android] Android 锁屏实现与总结 (一) [Android] Android 锁屏实现与总结 ...

  9. SpringBoot系列: RestTemplate 快速入门

    ====================================相关的文章====================================SpringBoot系列: 与Spring R ...

  10. Karma (Test runner)

    Karma https://baike.baidu.com/item/%E7%BE%AF%E7%A3%A8/7618552?fromtitle=Karma&fromid=878453 1,意译 ...