一、匿名管道的一个限制就是只能在具有共同祖先的进程间通信
命名管道(FIFO):如果我们想在不相关的进程之间切换数据,可以使用FIFO文件来做这项工作
注意:命名管道是一种特殊类型文件。
利用命令:$ mkfifo filename
或者相关函数:int mkfifo(const char*filename,mode_t mode);
  二、区别与联系
匿名管道由pipe函数创建或打开
命名管道由mkfifo函数创建,打开用open.
FIFO与PIPE的区别在它们创建与打开的方式不同,一旦这些工作完后,它们语义相同。

#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h> #include<signal.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一条语句
int main(int argc,char*argv[])
{
umask(0);//掩码先要清零。 mode & (~umask)
mkfifo("p2",0644);//当前路径下创建一个p2
return 0;
}

  有名管道读写规则

命名管道打开规则:如果当前打开操作是为读而打开FIFO
O_NONBLOCK disable:阻塞直到有相应的进程为写而打开FIFO
O_NONBLOCK enable:非阻塞模式立刻返回成功。并不是-1。不要等到有一个进程写而打开。
如果当前打开操作是为写而打开FIFO
O_NONBLOCK disable:阻塞直到有相应的进程为读而打开FIFO
O_NONBLOCK enable:立刻返回失败,错误码ENXIO

  下面两个进程,一个是读打开,一个是为写而打开,阻塞非阻塞的区别见程序:

#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h> #include<signal.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一条语句 int main(int argc,char*argv[])
{
int fd;
fd=open("p1",O_RDONLY);//打开p1,默认阻塞模式.用mkfifo p1已经创建好了p1管道文件。
//fd=open("p1",O_RDONLY|O_NONBLOCK);//非阻塞模式打开,直接返回成功,不用等另一个进程写成功
if(fd==-1)
ERR_EXIT("open error");
printf("open success\n");
return 0;
}

  下面这一进程以写的方式打开FIFO ,同时运行上一个以读的方式打开FIFO进程。则两个都成功了。

1、如果是O_NONBLOCK disable:阻塞直到有相应的进程为读而打开该FIFO;

2、如果是O_NONBLOCK enable:立刻返回失败,错误码为ENXIO。

#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一条语句
int main(int argc,char*argv[])
{
int fd;
//fd=open("p1",O_WRONLY);//写打开p1,阻塞.用mkfifo p1
fd=open("p1",O_WRONLY|O_NONBLOCK);//非阻塞模式打开(没有任何为读而打开的)立刻返回失败
if(fd==-1)
ERR_EXIT("open error");
printf("open success\n");
return 0;
}

命名管道FIFO及其读写规则的更多相关文章

  1. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  2. Linux学习笔记25——命名管道(FIFO)

    1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...

  3. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  4. 进程间通信___命名管道(FIFO)

    命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...

  5. 命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

  6. 进程间通信:命名管道FIFO(2)

    一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...

  7. 命名管道FIFO

    首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题 ...

  8. mkfifo - 创建FIFO(命名管道)

    SYNOPSIS(总览) mkfifo [options] file... POSIX options(选项): [-m mode] GNU options(选项)(最短格式): [-m mode] ...

  9. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

随机推荐

  1. 【暑假集训】HZOI2019 Luogu P1006 传纸条 二三四维解法

    写三次丢失两次,我谔谔,以后再不在博客园先保存我就去死 题目内容 洛谷链接 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学被安排坐成一个\(m\)行.\(n\ ...

  2. kafka-消费者测试

    1. 在窗口1创建一个producer,topic为test,broker-list为zookeeper集群ip+端口   /usr/local/kafka/bin/kafka-console-pro ...

  3. mysql中事件失效如何解决

    重启Mysql服务可能会导致event_scheduler关闭,事件失效.解决方法如下: 1.解决办法: #查看是否开启 show variables like 'event_scheduler'; ...

  4. 五分钟详解MySQL并发控制及事务原理

    在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...

  5. C++学习笔记---指针

    1.基本概念 作用:可以通过指针直接访问内存 内存编号是从0开始记录的,一般用16进制数字表示 可以利用指针变量保存地址 2.定义和使用 定义指针 他们的关系就是这样的 运行输出 使用指针 运行输出会 ...

  6. Docker结合.Net Core初步使用

    Docker是一项比较流行的容器化技术,可以让开发者将应用以及应用依赖的环境,依赖包一起打包到容器中,然后部署容器到生产环境就可以了,解决了应用程序部署到不同服务器环境带来的问题(很多开发人员都遇到过 ...

  7. 这十个Python常用库?学习Python的你必须要知道!

    想知道Python取得如此巨大成功的原因吗?只要看看Python提供的大量库就知道了 ,包括原生库和第三方库.不过,有这么多Python库,有些库得不到应有的关注也就不足为奇了.此外,只在一个领域里的 ...

  8. apktool重新打包添加签名

    一.生成apk apktool b 反编译后项目目录 -o 新apk名称.apk 二.生成签名 keytool -genkeypair -alias 新apk名称.apk -keyalg RSA -v ...

  9. vue学习笔记(一)---- vue指令( v-bind 属性绑定 )

    看栗子: <body> <div id="app"> <input type="button" value="按钮&qu ...

  10. Spring框架中获取连接池常用的四种方式

    1:DBCP数据源 DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,所 ...