有名管道特点

1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围

2)有名管道可以使互不相关的两个进程互相通信。

3)有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中。

4)进程通过文件IO来操作有名管道

5)有名管道遵循先进先出规则

6)不支持如lseek() 操作

注意
以O_WRONLY打开管道,读阻塞
以O_RDWR打开管道,当管道中没有数据,读阻塞
//当进程用open打开有名管道用只读方式打开的话,则返回的文件描述符就代表管道的读端

创建有名管道

  int mkfifo(const char *filename, mode_t  mode)

  参数:filename 有名管道文件名(包括路径);mode 权限(读写0666)

  成功返回 0 ,失败返回-1 并设置 errno 号 errno == EEXIST 时表示该有名管道已经存在

对有名管道的操作是通过文件IO 中的open read write 等操作的

例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h> int main(int argc, const char *argv[])
{
char buf[] = {};
if(mkfifo("./fifo",) != ) //在当前路径下(运行程序所在的路径)创建有名管道,有名管道权限读写执行
{
if(errno == EEXIST) //当该有名管道存在时,提示下
{
printf("File exists\n");
}
else
{
perror("mkfifo fail ");
exit();
}
} int fd;
fd = open("./fifo",O_RDWR);//读写方式打开,使用文件IO 操作有名管道
if(fd < )
{
perror("open fifo fail: ");
exit();
}
write(fd,"",);
read(fd,buf,);
printf("%s\n",buf);
return ;
}

测试:

 例子:通过有名管道让两个进程实现文件的复制

(1)读取文件写入有名管道中

/* 功能:实现在终端上输入获取文件名,读取文件内容,写到有名管道fifo中
* */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
char buf[] = {};
if(mkfifo("./fifo",) != ) //创建有名管道
{
if(errno == EEXIST)
{
printf("File exists\n");
}
else
{
perror("mkfifo fail ");
exit();
}
}
int fd_fifo,fd_file;
fd_fifo = open("./fifo",O_WRONLY);//只写方式打开,管道描述符
if(fd_fifo < )
{
perror("open fifo fail: ");
exit();
}
fd_file = open(argv[],O_RDONLY);//只读方式打开,源文件进行复制到管道中
if(fd_file < )
{
perror("open source fail ");
exit();
} //循环读取文件内容
ssize_t size;
while()
{
size = read(fd_file,buf,); //文件中读取数据,返回读取到多少数据
if(size <= )
{
break;
}
write(fd_fifo,buf,size);
}
close(fd_file);//关闭读的源文件
close(fd_fifo);
return ;
}

(2)读取有名管道中的数据,写入文件中实现复制

/* 功能:实现在有名管道中读取数据,写到文件中
* */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
char buf[] = {};
if(mkfifo("./fifo",) != ) //创建有名管道
{
if(errno == EEXIST) //有名管道存在的情况
{
printf("File exists\n");
}
else
{
perror("mkfifo fail ");
exit();
}
} int fd_fifo,fd_file; //此处fd_r是指有名管道,在有名管道中读取数据,写到文件中 fd_fifo = open("./fifo",O_RDONLY);//读方式打开
if(fd_fifo < )
{
perror("open fifo fail: ");
exit();
} fd_file = open(argv[],O_WRONLY|O_CREAT|O_TRUNC,);//把从有名管道中读取的数据,写到文件中,只读,没有创建,清空打开
if(fd_file < )
{
perror("fd_w open fail ");
exit();
}
//fifo 中循环读取数据,然后写到文件中
ssize_t size;
while()
{
size = read(fd_fifo,buf,); //读有名管道内容,返回读取多少个数据
if(size <= )
{
break;
}
write(fd_file,buf,size); //写入文件中
}
close(fd_fifo);
close(fd_file);
return ;
}

测试:此时要打开两个终端让两个进程进行通信,一个执行写操作,一个执行都操作(有名管道中有数据才可以读,且管道数据内容存在内存中)

Linux 进程间通信 有名管道(fifo)的更多相关文章

  1. linux进程间通信-有名管道(FIFO)

    有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...

  2. linux进程间通信--有名管道

    有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...

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

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

  4. Linux 进程间通信之管道(pipe),(fifo)

     无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...

  5. Linux进程间通信之管道

    1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...

  6. Linux 进程间通信(二) 管道

    Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...

  7. 有名管道FIFO

    管道和FIFO的特征之一是它们的数据是一个字节流.这是UNIX的原生I/O模型.进程往其中写入的是字节流,系统不对它作解释. FIFO不存数据,只是通过它找到内核文件. 一.建立有名管道 1.命令mk ...

  8. Linux -- 进程间通信之管道

    管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式   创建一个管道文件有两种方式:  Shell 下命令 mkfifo + filename,即创建一个有名管道 ...

  9. linux进程间通信之管道篇

    本文是对http://www.cnblogs.com/andtt/articles/2136279.html管道一节的进一步阐释和解释 1 管道 1.1 管道简介 管道是unix系统IPC的最古老的形 ...

随机推荐

  1. arcpy-栅格转其他格式

    import arcpy in_format=arcpy.GetParameterAsText(0) out_format=arcpy.GetParameterAsText(1) out_folder ...

  2. Python之os.path.join()

    os.path.join()函数用于路径拼接文件路径. os.path.join()函数中可以传入多个路径: 会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况 ...

  3. JS浏览器事件循环机制

    文章来自我的 github 博客,包括技术输出和学习笔记,欢迎star. 先来明白些概念性内容. 进程.线程 进程是系统分配的独立资源,是 CPU 资源分配的基本单位,进程是由一个或者多个线程组成的. ...

  4. SQLServer存储过程学习记录

    简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理. 一.存储过程的概述 SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便 ...

  5. 将Eclipse项目转换成AndroidStudio项目过程中遇到的问题以及解决方法

    将Eclipse项目转换成AndroidStudio项目也不是第一次了,昨天转的时候遇到几个问题: 首先将项目导入androidstudio,导完后报错: 问题一: Error:java.util.c ...

  6. Tmux 简单配置使用

    Tmux Prefix (prefix) Tmux 使用 Prefix 以将自身的快捷键与其它应用区分,运行 Tmux 快捷键时首先按下这个 Prefix (默认是 Ctrl-b 组合键),松手后紧接 ...

  7. JavaScript常见设计模式梳理

    单例模式 单例模式,顾名思义就是保证每个类都只有一个实例对象. 其实现思路很简单,先判断实例是否存在,如果不存在则创建新的实例返回,如果存在则直接返回该实例. 策略模式 策略模式可以理解为:封装多个可 ...

  8. 【JZOJ3920】噪音

    description FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i] ...

  9. thinkphp IP获取和定位

    系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...

  10. Linux环境下安装PHP的memced扩展

    先下载libmemcached: wget  https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.t ...