命名管道FIFO及其读写规则
一、匿名管道的一个限制就是只能在具有共同祖先的进程间通信
命名管道(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及其读写规则的更多相关文章
- 进程间通信系列 之 命名管道FIFO及其应用实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- Linux学习笔记25——命名管道(FIFO)
1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- 进程间通信___命名管道(FIFO)
命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...
- 命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...
- 进程间通信:命名管道FIFO(2)
一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...
- 命名管道FIFO
首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题 ...
- mkfifo - 创建FIFO(命名管道)
SYNOPSIS(总览) mkfifo [options] file... POSIX options(选项): [-m mode] GNU options(选项)(最短格式): [-m mode] ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
随机推荐
- 为什么说 Python 内置函数并不是万能的?
本文出自"Python为什么"系列,请查看全部文章 在Python猫的上一篇文章中,我们对比了两种创建列表的方法,即字面量用法 [] 与内置类型用法 list(),进而分析出它们在 ...
- docker-搭建单机 kafka+zookeeper
1 zookeeper docker run --name zookeeper -p 12181:2181 -d wurstmeister/zookeeper:latest 2 kafka ...
- linux(centos8):用tr替换或删除字符
一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...
- 【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
问题描述 在默认的URL传递参数中,我们使用的是https://test01.azure-api.cn/echo/resource?param1=sample¶m2=testname这 ...
- linux mkfifo命令基本用法
首先了解linux命令执行顺序 通常情况下,终端只能执行一条命令,然后按下回车,那么执行多条命令呢 顺序执行多条命令,可以用分号; cmd1;cmd2;cmd3 条件执行多条命令,使用&&am ...
- ASP.NET Core托管运行Quartz.NET作业调度详解
Quartz.NET这么NB的作业调度系统,不会还行? 今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...
- 论文解读《Learning Deep CNN Denoiser Prior for Image Restoration》
CVPR2017的一篇论文 Learning Deep CNN Denoiser Prior for Image Restoration: 一般的,image restoration(IR)任务旨在从 ...
- Redis学习笔记(三)——数据结构之字符串(String)
一.介绍 String类型,是二进制安全的,存入和获取的数据相同,value最多可以容纳的数据长度是512M,可以存放json数据,图像数据等等. 存储String常用命令: 赋值(set) 取值(g ...
- JVM详解(二)-- 第2章 类加载器子系统
一.JVM内存结构 1.1 内存结构---概略图 1.2 内存结构--详细图 二.类加载器子系统的作用 类加载器子系统负责从文件系统或网络中加载.Class文件,文件需要有特定的标识(cafe bab ...
- element ui实现form验证起始时间不能大于结束时间
<el-form-item label="开始时间" :label-width="formLabelWidth" prop="startTime ...