1、什么是有名管道?为什么有了管道还需要有名管道?

有名管道是解决管道不能提供非父子进程间通信的缺陷。管道在Linux系统内部是以文件节点(inode)的形式存在,但由于其对外的不可见性(“无名”性),就无法创建新的句柄对其进行访问。而有名管道则以一种特殊的设备文件的形式存在于文件系统中,这样,有名管道不仅有了管道的通信功能,还具备普通文件的优点,也就是可以被对个进程共享,可以长期存在等。

2、有名管道的创建

有名管道是文件系统中的文件节点,可以通过建立文件节点的方式创建有名管道,可以用命令

#mknod sampleFIFO p
#mkfifo –m 0666 sampleFIFO

  上面两个命令时等价的,在当前的文件系统中创建一个名字为sampleFIFO的有名管道。文件信息中p指示符可以迅速辨认出有名管道,如

#ls -l
prw-r--r-- 1 root root 0 May 14 16:25 sampleFIFO|

  可以看到sampleFIFO是有名管道。

在C语言中是用mknod()创建有名管道,函数声明是int mknod( char *pathname, mode_t mode, dev_t dev);

例如:

mknod(“/tmp/sampleFIFO”,s_IFIFO|0666,0)

  这条语句建立了一个名为“/tmp/sampleFIFO”的有名管道,读写权限是0666,第三个参数默认填0

3、有名管道的I/O使用

可以用操作文件流fopen()和fclose()来打开一个有名管道,下面是server方的例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>
#define FIFO_FILE "sampleFIFO"
int main(void)
{
FILE *fp;
char readbuf[80];
/* Create the FIFO if it does not exist */
umask(0);
/*在文件系统中创建有名管道*/
mknod(FIFO_FILE, S_IFIFO|0666, 0);
while(1)
{
/*打开有名管道*/
fp = fopen(FIFO_FILE, "r");
/*从有名管道中读取数据*/
fgets(readbuf, 80, fp);
printf("Received string: %s\n", readbuf);
/*关闭有名管道*/
fclose(fp);
}
return(0);
}

  由于有名管道自动支持进程阻塞,所有我们可以让这个server在后台运行

#fifoserver &

  然后运行client程序

#include <stdio.h>
#include <stdlib.h>
#define FIFO_FILE "sampleFIFO"
int main(int argc, char *argv[])
{
FILE *fp;
if ( argc != 2 )
{
printf("USAGE: fifoclient [string]\n");
exit(1);
}
/*打开有名管道*/
if((fp = fopen(FIFO_FILE, "w")) == NULL)
{
perror("fopen");
exit(1);
}
/*向有名管道中写入数据*/
fputs(argv[1], fp);
/*关闭有名管道*/
fclose(fp);
return(0);
}

  由于有名管道的自动阻塞特性,server打开一个有名管道准备读入时,server会被阻塞以等待其他进程在有名管道写入数据。

4、tips

1)有名管道必须要有读和写两个进程端,,如果试图向一个没有读入端进程的有名管道写入数据,则会产生SIGPIPE信号

2)管道操作的独立性,也就意味着这个操作不会因为任务原因中断,Linux系统中,一次独立的读/写操作只能传送4096个字节数据,若超过了上限,需要分多次传输,否则可能会被其他进程的写操作打断,可能把数据插入了该进程写入管道的数据序列中造成数据混乱。这点特别注意

Linux网络编程学习(七) ----- 有名管道(第四章)的更多相关文章

  1. Linux网络编程学习(九) ----- 消息队列(第四章)

    1.System V IPC System V中引入的几种新的进程间通信方式,消息队列,信号量和共享内存,统称为System V IPC,其具体实例在内核中是以对象的形式出现的,称为IPC 对象,每个 ...

  2. Linux网络编程学习(二) ----- 进程控制(第三章)

    1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...

  3. Linux网络编程学习计划

    由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章   概论   P1-16 第二章   UNIX ...

  4. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  5. Linux网络编程学习(十二) ----- 结语

    该书提前看完了,重点看了第四章和第六章,第七章以后只是大致浏览了一下,如果以后工作中涉及这一块再仔细研究一下,大概花了二十天的样子,主要了解了进程间的通信方式.socket编程以及五种I/O模式,看的 ...

  6. Linux网络编程综合运用之MiniFtp实现(四)

    从今天开始,正式进入MiniFtp的代码编写阶段了,好兴奋,接下来很长一段时间会将整个实现过程从无到有一点点实现出来,达到综合应用的效果,话不多说正入正题: 这节主要是将基础代码框架搭建好,基于上节介 ...

  7. Linux网络编程学习(六) ----- 管道(第四章)

    1.管道的定义 管道就是将一个程序的输出和另外一个程序的输入连接起来的单向通道,比如命令: ls -l|more,就建立了一个管道,获取ls -l的输出作为more的输入,数据就沿着管道从管道的左边流 ...

  8. linux网络编程学习笔记之四 -----多-threaded服务器

    对于使用过程中并发.通过实现更轻量级线程. 每个线程都是一个独立的逻辑流. 主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元.当然,这是在微内核操作系统说.总之,这是唯一的一个操作系统内核 ...

  9. Linux网络编程学习(十) ----- Socket(第六章)

    前言:由于第五章主要介绍了TCP和UDP协议以及两者的包头的字段以及相应的功能,这里就不介绍了,对着字段看功能就好了,后续开始学习第六章 1.Socket Socket实质上就是提供了通信的端点,每个 ...

随机推荐

  1. Linux下的常用文本编辑器

    Linux的文本编辑器 ed 在早期的unix平台上,ed可以说是唯一的编辑工具.它是一个很古老的行编辑器,vi这些编辑器都是从ed 演化而来.行编辑器使用起来很不方便,每次只能对一行进行操作,.而后 ...

  2. 提示-bash: telnet: command not found的解决方法

    Linux centos 运行telnet命令,出现下面的错误提示: [root@localhost ~]# telnet 127.0.0.1 9501 -bash: telnet: command ...

  3. Javascript小问题

    1.原生对象克隆 var clone = function(obj) { var o; if (typeof obj == "object") { if (obj === null ...

  4. python3-可变长度参数函数(*args 和 **kwargs)

    简述: *args:    可变长度元组参数    **kwargs: 可变长度字典参数 ------------------------------------------------------- ...

  5. Java 开始

    (事先声明:该文章并非完全是我自己的产出,更多的是我个人在看到资料后通过理解并记录下来,作为自己阅读后的一个笔记:我现在试图对自己多年工作中的知识点做一个回顾,希望能融会贯通) (此文参考<Ja ...

  6. ES6系列之箭头函数

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...

  7. mybatis缓存的设计

    继续用提问的方式来看Mybatis的缓存设计. 1.Mybatis如何开启缓存 Mybatis对查询结果进行缓存,所以缓存的对象为具体的Statement 通过在Statement上是否使用缓存来启用 ...

  8. 高性能 TCP & HTTP 通信框架 HP-Socket v4.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  9. RocketMQ源码分析:(二)消息发送的三种方式

    1. 同步传输(可靠,适用于重要的通知消息.短信通知.短信营销系统等) package com.miaoying.rocketmq.client; import lombok.extern.slf4j ...

  10. flink入门:01 构建简单运行程序

    1. mac平台安装flink(默认最新版) brew install apache-flink 安装结果: Version 1.7.1, commit ID: 89eafb4 2. jdk版本,我尝 ...