首页 > 进程间通信--命名管道

进程间通信--命名管道

几个术语

  • 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性
  • 临界资源:多个流可以访问的一个共同的存储资源
  • 临界区:访问临界资源的代码叫做临界区
  • 互斥:任一时候只能有一个进程利用临界资源访问临界区,并且是以原子性访问
  • 原子性:要么访问,要么没有访问,不存在正在访问的情况
  • 饥饿问题:一个进程因为级别低,在某些场景之下要求访问某一资源的时候一直访问不了,这就出现了饥饿问题
  • 同步:按照某一顺序访问临界资源

命名管道

命名管道的概念

匿名管道(pipe)的一个不足之处就是,匿名管道只能用于具有血缘关系的进程之间的通信,但是进程间通信的时候有很多时候都不是具有血缘关系的,这个时候就需要其他的一些通信方式,然后就有了命名管道。 命名管道通过一个路径将各个进程相连,只要一个进程能够访问某一个路径就能够访问这个管道了

命名管道的创建和读写

在shell下面我们可以使用mknod和mkfifo来创建管道

这里我们经常使用的是mkfifo,所以只是简单的介绍一个mkfifo,另一个就不做详细的介绍了

我们在shell下可以使用mkfifo myfifo.pipe来创建一个命名管道,然后在记住他的路径,在使用的时候,我们可以直接通过open来打开一个管道进行读写的 操作

下面的是程序中使用的mkfifo函数,先看接口原型

#include 
#include 
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
#include
#include
#include
#include
#include#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"int main()
{umask(0);if(mkfifo(_PATH_,0666|S_IFIFO) < 0 ){printf("fifo error
");return 1;}int fd = open(_PATH_,O_WRONLY);if(fd <= 0){printf("open error
");return 1;}else{char buf[100];memset(buf,'',sizeof(buf));while(1){scanf("%s",&buf);int wr = write(fd,buf,sizeof(buf));if(wr <= 0){printf("write error
");break;}}}close(fd);return 0;
}

读端

#include
#include
#include
#include
#include
#include#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"int main()
{int fd = open(_PATH_,O_RDONLY);   //只读方式打开一个管道if(fd < 0)    //打开管道失败{printf("read error
");return 1;}else   //打开管道成功{char buf[100];memset(buf,'',sizeof(buf));while(1){int red = read(fd,buf,sizeof(buf));  //把管道里面的内容读取到buf中,所以上面应该加上memset这个函数,对buf进行初始化if(red <= 0)   //{printf("read error
");break;}printf("%s
",buf);}close(fd);}return 0;
}

更多相关:

  • 新建管道:   ​​​​​​​ng g pipe pipes/money或​​​​​​​ng g p pipes/money pipes/money.pipe.ts,同时在父级module.ts加入import { MoneyPipe } from './pipes/money.pipe'; @NgModule({  decla...

  • 文章目录通过管道同步进程实现代码管道缓冲区设置缓冲区大小总结 :pipe的特点 通过管道同步进程 管道自带同步互斥机制: 管道的内核实现:fs/pipe.c ,主要通过内核的锁以及等待队列等机制实现 管道的write操作会阻塞进程 当内存缓冲区已满或被读进程锁定,会阻塞write操作当所有数据被写入管道时write操作才会结...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...