有名管道
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. 面向对象15.1String类特点

    String 特点: 字符串对象一旦被初始化就不会被改变. public class Ssstring {public static void main(String[] args) { //这个是2 ...

  2. MySQL二进制日志备份和恢复详解

    原文链接:http://www.showerlee.com/archives/681 ****经实践,该教程ok,特在此分享**** 基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了 ...

  3. poj 1161 Walls

    https://vjudge.net/problem/POJ-1161 题意:有m个区域,n个小镇,有c个人在这些小镇中,他们要去某一个区域中聚会,从一个区域到另一个区域需要穿墙,问这些人聚到一起最少 ...

  4. The first day,I get a blogs!!

    我拥有了自己的博客,很happy! 今天学习了kvm,虽然命令行界面比较枯燥,还好不算太难,在大家的热心帮助下我创建了一个虚拟机!!

  5. A----奇怪的玩意

      题目: 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板菌落.大部分的时间stripies在移动.当他 ...

  6. [C++]智能指针的实现与使用

    智能指针 智能指针是当我们在使用对象时,有时会把对象的内存分配在堆上忘记释放,导致内存泄露,并且当多个指针共享同一个对象的内存时,容易出现重复释放内存,导致错误. 我们针对所需要共享的对象,手动完成一 ...

  7. (转)完整java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  8. 关于JavaScript组件化的探索

    Loaders 先放出项目地址:https://github.com/j20041426/Loaders 这是一个可以动态选择加载动画的样式和颜色的插件.这个项目仅仅是作为对js组件化的一个探索,不太 ...

  9. oracle 通过同义词建立视图

    需要给予以下权限. GRANT CREATE VIEW TO tms;GRANT SELECT ANY table TO tms;GRANT SELECT ANY DICTIONARY TO tms;

  10. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...