有名管道
1、查看命令:man 3 mkfifo

2、头文件:#include <sys/types.h>
#include <sys/stat.h>

3、函数原型:int mkfifo(const char *pathname, mode_t mode);
a、*pathname:有名管道的名字 例如:/home/gec/myfifo
b、 mode:八进制的权限, 例如:0777

4、返回值:
成功:0
失败-1

5、函数特点:
有名管道存在于文件系统中,提供写入原子性特征,共享内存效率高

6、有名管道的特征:
a、有名字,储存于普通文件系统中
b、任何具有相应权限的进程都可以使用open()来获取FIFO的文件描述符
c、跟普通文件一样,用read()和writ()来读和写
d、不能用lseek来定位
e、具有写入原子性,支持多写者同时进行写操作而数据不会相互践踏

()读取数据的代码:fifo_read.c
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h> #define FIFO "/home/gec/FIFO" /*有名管道的名字*/
#define LENGTH 50 /*字符数组的长度*/
int main(int argc,char **argv)
{
int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存放打开有名管道的文件描述符*/
char buf[LENGTH]; if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0否则返回非0的数*/
{
ret = mkfifo(FIFO,); /*创建有名管道,成功返回0,失败返回-1*/
if(ret == -) /*创建有名管道失败*/
{
perror("mkfifo");
exit();
}
} fd = open(FIFO,O_RDONLY); /*已读方式打开有名管道,不能同时以读写权限打开,成功返回文件
描述符,失败返回-1*/
if(fd == -) /*打开失败*/
{
perror("open");
exit();
}
puts("从有名管道中读取到的数据:");
while()
{
memset(buf,,sizeof(buf)); /*清空缓冲区*/ read(fd,buf,sizeof(buf)); /*阻塞读取有名管道中的数据到buf中*/ printf("%s",buf); if(strncmp(buf,"q",) == ) /*buf中的数据和q比较,如果相等,则返回0*/
{
break;
}
} close(fd); /*关闭有名管道*/
return ;
}
()写入数据的代码:fifo_write.c
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h> #define FIFO "/home/gec/FIFO" /*有名管道的名字*/
#define LENGTH 50 /*字符数组的长度*/
int main(int argc,char **argv)
{
int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存放打开有名管道的文件描述符*/
char buf[LENGTH]; if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0 否则返回非0的数*/
{
ret = mkfifo(FIFO,); /*创建有名管道,成功返回0,失败返回-1*/
if(ret == -) /*创建有名管道失败*/
{
perror("mkfifo");
exit();
}
} fd = open(FIFO,O_WRONLY); /*以写方式打开有名管道,不能同时以读写权限打开,成功返回文件
描述符,失败返回-1*/
if(fd == -) /*打开失败*/
{
perror("open");
exit();
} puts("请输入数据到有名管道中,输入q退出:");
while()
{
memset(buf,,sizeof(buf)); /*清空缓冲区*/ fgets(buf,sizeof(buf),stdin); /*从终端输入数据到buf中*/
write(fd,buf,strlen(buf)); /*阻塞把数据写入有名管道*/ if(strncmp(buf,"q",) == ) /*buf中的数据和q比较,如果相等,则返回0*/
{
printf("aaaa\n");
break;
}
} close(fd); /*关闭有名管道*/
return ;
}

linux之有名管道的更多相关文章

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

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

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

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

  3. linux下有名管道进程通信

    一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo ...

  4. Linux 进程间通信 有名管道(fifo)

    有名管道特点: 1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围 2)有名管道可以使互不相关的两个进程互相通信. 3)有名管道可以通过路径名来指出,并且在文件系统中可见,但内容 ...

  5. Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()

    1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

  6. Linux 进程通信(有名管道)

    有名管道(FIFO) 有名管道是持久稳定的. 它们存在于文件系统中. FIFO比无名管道作用更大,因为他们能让无关联的进程之间交换数据. 管道文件一般用于交换数据. shell命令创建管道 一个she ...

  7. Linux进程间通信IPC学习笔记之有名管道

    基础知识: 有名管道,FIFO先进先出,它是一个单向(半双工)的数据流,不同于管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)有一个与路径名关联的名 ...

  8. Linux系统编程(11)——进程间通信之有名管道

    管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以 ...

  9. linux 有名管道(FIFO)

    http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...

随机推荐

  1. 容器_JDK源码分析_自己简单实现ArrayList容器

    这几天仔细研究下关于ArrayList容器的jdk源码,感觉收获颇多,以前自己只知道用它,但它里面具体是怎样实现的就完全不清楚了.于是自己尝试模拟写下java的ArrayList容器,简单了实现的Ar ...

  2. OpenStack(企业私有云)万里长征第五步——虚拟机Migrate&Resize

    一.前言 上一篇文章讲了OpenStack的部署和简单操作,今天介绍一下如何实现虚拟机的Migrate以及Resize.Migrate操作和Resize操作基本上属于同一种操作,Migrate操作只是 ...

  3. dfs.datanode.max.transfer.threads

    An HDFS DataNode has an upper bound on the number of files that it will serve at any one time: <p ...

  4. 解决win10系统以太网适配器的驱动程序可能出现问题

    插上网线显示未连接-连接可用,连上无线显示未连接-连接不可用,右下角显示感叹号 ,以太网和无线属性显示ipv4未连接详细信息为空,在设备管理器里卸载网卡驱动重装上仍然没有,通过windoes自带的网络 ...

  5. 软件安装(JDK+MySQL+TOMCAT)

    一,JDK安装 1,查看当前Linux系统是否已经安装了JDK 输入 rpm -qa | grep java 如果有: 卸载两个openJDK,输入rpm -e --nodeps 要卸载的软件 2,上 ...

  6. redhat系列linux系统 修改主机名的正确方法

    ##注:无特别说明,以下称呼的linux系统统一视为redhat系linux redhat系列linux系统 如果想修改主机名 很多人可能都会以为是: $hostname NEW-NAME 或者在 / ...

  7. 小程序开发教程:wx.setTopBarText(OBJECT)

    状态信息展示 当小程序被显示在聊天顶部时,开发者可将重要的状态变更信息实时展示出来,便于用户及时获知. 详见文档:小程序文档 小程序更新之后,有个更有用的功能!支持状态栏实时状态更新!! wx.set ...

  8. 由于用mpu6050模块,所以要用上i2c通信原理。

    i2c通信原理 i2c总线只有两根双向信号线,一根是数据线SDA,一根是时钟线SCL. 每个接到i2c总线上的器件都有唯一的地址,主机与其他器件之间的数据传送可以是由主机发送给其他器件.主机为发送器, ...

  9. C语言基础 - 输出1-100万之间的素数

    其实这个很简单 代码 网上也一大堆... //判断素数 BOOL isPrime(int num) { for (int i = 2; i <= sqrt(num); i++) { //能整除则 ...

  10. 共享---samba

    1.  虚拟机,可以采用共享文件夹 2.  windows之间可以使用网络邻居共享 3.  windows与linux,linux与linux之间建立samba服务器 4.  安装samba服务器 r ...