进程间通信--命名管道
几个术语
- 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性
- 临界资源:多个流可以访问的一个共同的存储资源
- 临界区:访问临界资源的代码叫做临界区
- 互斥:任一时候只能有一个进程利用临界资源访问临界区,并且是以原子性访问
- 原子性:要么访问,要么没有访问,不存在正在访问的情况
- 饥饿问题:一个进程因为级别低,在某些场景之下要求访问某一资源的时候一直访问不了,这就出现了饥饿问题
- 同步:按照某一顺序访问临界资源
命名管道
命名管道的概念
匿名管道(pipe)的一个不足之处就是,匿名管道只能用于具有血缘关系的进程之间的通信,但是进程间通信的时候有很多时候都不是具有血缘关系的,这个时候就需要其他的一些通信方式,然后就有了命名管道。 命名管道通过一个路径将各个进程相连,只要一个进程能够访问某一个路径就能够访问这个管道了
命名管道的创建和读写
在shell下面我们可以使用mknod和mkfifo来创建管道
这里我们经常使用的是mkfifo,所以只是简单的介绍一个mkfifo,另一个就不做详细的介绍了
我们在shell下可以使用mkfifo myfifo.pipe来创建一个命名管道,然后在记住他的路径,在使用的时候,我们可以直接通过open来打开一个管道进行读写的 操作
下面的是程序中使用的mkfifo函数,先看接口原型
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);
解释一些返回值和参数,创建成功返回0,失败返回-1。
参数中const char *filename,就是一个路径加上文件名的形式,mode_t mode是我们创建的这个管道的操作权限,我们可以是设置为0666 | S_IFIFO,如下的使用方式,其中的S_IFIFO是一个固定的操作命名管道的一种方式,这里先不用管
我们在函数中可以按照如下的使用
if(fifo("./pipe",0666 | S_IFIFO) < 0)
{printf("fifo error");return 1;
}
下面我们通过一个简单的程序实现一个写端,一个读端的操作,这个时候我们可以打开两个终端,分别运行下面的程序,就会实现进程间通信,一个写,一个读
写 端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"int main()
{umask(0);if(mkfifo(_PATH_,0666|S_IFIFO) < 0 ){printf("fifo error\n");return 1;}int fd = open(_PATH_,O_WRONLY);if(fd <= 0){printf("open error\n");return 1;}else{char buf[100];memset(buf,'\0',sizeof(buf));while(1){scanf("%s",&buf);int wr = write(fd,buf,sizeof(buf));if(wr <= 0){printf("write error\n");break;}}}close(fd);return 0;
}
读端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"int main()
{int fd = open(_PATH_,O_RDONLY); //只读方式打开一个管道if(fd < 0) //打开管道失败{printf("read error\n");return 1;}else //打开管道成功{char buf[100];memset(buf,'\0',sizeof(buf));while(1){int red = read(fd,buf,sizeof(buf)); //把管道里面的内容读取到buf中,所以上面应该加上memset这个函数,对buf进行初始化if(red <= 0) //{printf("read error\n");break;}printf("%s\n",buf);}close(fd);}return 0;
}
相关文章:

websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制
在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否…

【转载】Asp.Net 全生命周期
用三张图片详解Asp.Net 全生命周期 此文是转载阳阳多的博客内容,特此声明。 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户…

Context-Based Access Control (CBAC) 基于上下文的访问控制 理论知识
CBAC即基于上下文的访问控制协议,通过检查防火墙的流量来发现管理TCP和UDP的会话状态信息。这些状态信息被用来在防火墙访问列表创建临时通道。通过在流量一个方向上配置ip inspect列表,放行其返回流量。被允许会话是指来源于受保护的内部网络会话。它不…

week6 10 后端backend server和mongoDB通信
0 之前我们maogoDB用的是在线的mlab 在线他们帮我们做好了model 也就是那个schma 其实python也有类似的包 帮我们定义这些model 但是呢 我们自己来做吧 用一个传统的意义上mongoDB 就是 insert select来操作数据库 就是在不用其他类库 定义的model 我们如何操作数据库 我们这次…

Linux网络端口
Linux下端口个数 首先简单介绍一下Linux下的端口的函数,当Linux各个主机之间进行通信的时候我们需要将某些数据进程传输,这个时候就需要将数据传入到某一个特定 的主机,这个时候就使用了TCP/IP协议,IP地址是用来标识互联网的唯一…

汉字书写解码_《汉字解码学》 第一部分
《汉字解码学》第一部份汉字与世界密码文字的关系文字是人类语言的书写符号,是人类用来进行传递信息以便进行交流的可见符号系统。文字是人类文明的标识和产物。我们的祖先是如何来到中国的?世界科学研究关于人类基因的研究的最新成果表明:世…

WCF中服务继承多个契约的使用
服务继承多个契约其实也就是服务类实现了多个接口,主要是在配置中需要添加多个endpoint,各个endpoint之间的address不同、contract不同 契约: [html] view plaincopyprint?[ServiceContract] public interface IReportService { [Ope…

Pentaho平台上加仪表盘插件步骤
Pentaho平台上加仪表盘插件步骤 下面我将最近学习的在Pentaho平台上加仪表盘插件的步骤稍微整理了一下,希望对有需要的朋友有些帮助。 1. 解压插件包:cdf-de_0.2.tar.bz2(这个插件压缩包我即将上传) ,得到cdf- de_0.2 …

2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题。 设f[i][j]表示前i轮j获胜的概率。 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1)^1(k−1)>>(i−1)1(k−1)>>(i−1)。 简单举个例子? 假设有八个人&a…
循环冗余检验CRC
CRC简介 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。 在数据传输过程中,…

弹性碰撞后速度方向_$1.1.1 弹性碰撞经典例题1——力学及运动学
[ph1] 质量为2m的木块放置于质量为m的长木板上,木块与模板之间的动摩擦系数为 μ ,木板与地面的摩擦忽略不计。木块和木板以速度V0向右运动,在右侧足够远处有刚性墙壁,木块与墙壁发生完全弹性碰撞后向左运动,木板有足够…

一个简单实用的,基于EF的三层架构
到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会太差.我觉的这样的框架,就是一个好的框架.而且,我觉的做框架,千万不能…

转:中国互联网十五年的22个创新模式
中国互联网十五年的22个创新模式 今天,看网上有人推荐《沸腾十五年》,讲中国互联网从发源到现今。 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什么会是他们出来了。他们的…

2018 蓝桥杯省赛 B 组模拟赛(一)-年龄
今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不…

C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件
今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的…

IPC--消息队列
消息队列的特点 消息队列是生命周期是随进程的,同时消息队列可以实现的是消息的传递方向是双向的。接受者和发送者时通过发送一个数据块来进性消息传递的,每个消息的数据类型不一样依次来进行区分我们该取哪个数据。消息队列是基于消息的,并…

sqlinesdata教程_如何将Oracle数据导入MySQL
Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全…

关于PHP.ini文件的设定
php.ini文件中记录了php的配置,因此正确读取此配置文件对于php的部署实施很重要。 windows平台中,有2种常用的方法。 第一种方法:把php.ini复制到c:\windows目录中。 第二种方法:配置apache服务器,在..\Apache Softwar…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树
1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…

poj 1523(无向联通图的割点)
结合tarjan算法思想,这题终于写了出来。 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候&#…

IPC--信号量
信号量概念理解 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。信号量的工作原理:两个进程…

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡
很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法
2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram
ps:单调栈,注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存
有了之前的学习经验,共享内存对我们学习起来相对简单一些了,这里简单说说共享内存的一些,然后对于函数的分析直接在代码里面的注释部分有说明,如果还是不懂,可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据
本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码,带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市?答:柳州市有5个区、5个县(行政区划2020年7月)。分别为:城中区、鱼峰区…

sql2000 转sql2008
1,在sql2008服务器上新建空数据库,与sql2000同名,当然可以不同名。 2,在sql2008服务器上选择数据库,点右键,任务-导入数据。打开导入数据向导。 3,点击下一步,选择数据源。数据源可以…

linux下查看网卡型号
查看网卡型号[rootcentos /]# lspci | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)我这里型号是79c970,驱动pcnet32.查看驱动信息[rootcentos /]# modinfo pcnet32filename: /lib/modules/2.6.18-194.el5/…

linux_域名映射
vi /etc/hosts在最后加上ip及映射的域名192.168.229.111 node001192.168.229.112 node002192.168.229.113 node003 转载于:https://www.cnblogs.com/lxyuuuuu/p/9578659.html
地址解析协议ARP
设计需求 ARP协议解决的问题就是:在同一个局域网中,解决主机IP地址和硬件地址的映射问题 基本使用原理 当数据在网络中某一条链路传输的时候我们知道目的主机的IP地址,但是不知道硬件地址,ARP协议就是解决这个问题的一个协议&a…