管道

  提供一个单路(单向)数据流,可以为两个不同进程提供进程间的通信手段

#include <unistd.h>

    int pipe(int fd[]);

  返回两个文件描述符,fd[0](读) 和 fd[1](写)

  管道间的通信通常是使用 read 和 write 函数完成的

  管道的典型用法:

    首先,由父进程创建一个管道,然后调用fork派生一个自身的副本

    接着,父进程关闭管道的读端,子进程关闭管道的写段

    这样就在父子进程间提供了一个单向数据流

 

  双管道:

    当需要一个双向数据流的时候,我们必须创建两个管道,每个方向一个

int    pipe1[], pipe2[];
pid_t childpid; Pipe(pipe1);
Pipe(pipe2); if( (childpid = Fork()) == )
{
Close(pipe1[]);
Close(pipe2[]); /*代码*/ exit();
} Close(pipe1[]);
Close(pipe2[]); /*代码*/ Waitpid(childpid, NULL, );
exit();

FIFO

  指代先进先出(first in, first out),是一个单向数据流

  不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO,因而也称"有名管道"。(我更愿意把它看做一个文件)

#include <sys/types.h>
#include <sys/stat.h> int mkfifo(const char* pathname, mode_t mode);

  pathname是一个路径名,也是该FIFO的名字

  mode指文件的权限位

常值 说明

S_IRUSR

S_IWUSR

用户(属主)读

用户(属主)写

S_IRGRP

S_IWGRP

(属)组成员读

(属)组成员写

S_IROTH

S_IWOTH

其他成员读

其他成员写

    常值 FIFO_MODE 在 unpipc.h 中定义:

#define FIFE_MODE ( S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH )

  与管道不同的是:

    创建并打开一个管道只需用 pipe,创建并打开一个FIFO则需要调用 mkfifo 后再调用 open

    管道在所有进程都关闭它后自动消失,FIFO的名字则只有通过调用 unlink 才从文件系统中删除

#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2" int readfd, writefd;
pid_t childpid; if( (mkfifo(FIFO1, FILE_MODE) < ) && (errno != EEXIST) )
err_sys("can't create %s", FIFO1);
if( (mkfifo(FIFO2, FILE_MODE) < ) && (errno != EEXIST) )
{
unlink(FIFO1);
err_sys("can't create %s", FIFO2);
} if( (childpid = Fork()) == )
{
readfd = Open(FIFO1, O_RDONLY, );
writefd = Open(FIFO2, O_WRONLY, ); /*代码*/
//为什么这里不需要Close(readfd) Close(writefd)   exit();
} writefd = Open(FIFO1, O_WRONLY, );
readfd = Open(FIFO2, O_RDONLY, ); /*代码*/ Waitpid(childpid, NULL, ); Close(readfd);
Close(writefd); Unlink(FIFO1);
Unlink(FIFO2);
exit();

【读书笔记】管道和FIFO的更多相关文章

  1. 单字节的FIFO缓存(30天自制操作系统--读书笔记)

    从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...

  2. Learning The Bash Shell读书笔记(整理)

    最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...

  3. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  4. [转] IPC之管道、FIFO、socketpair

    管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向 ...

  5. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  6. Linux 之父自传《just for fun》读书笔记

    一次偶然的机会,看到了阮一峰老师关于这本书的介绍,当时我就觉得这本书相当有趣. 在没有读这本书之前,我觉得 linus 作为发明 Linux 系统的人,应该是一个比较严肃的人,就像我的老师一样.但事实 ...

  7. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  8. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  9. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  10. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

随机推荐

  1. 【HDU3440】House Man (差分约束)

    题目: Description In Fuzhou, there is a crazy super man. He can’t fly, but he could jump from housetop ...

  2. oracle中的一些函数笔记

    replace函数 replace(最长的字符串,被替换的字符串,替换字符串) 数学函数 round(n,[m]) 保留m位总共n位长度的数,采用四舍五入的方式. trunc(n,[m])截取数字,不 ...

  3. Ultraedit中使用Astyle格式化代码

    方法: 使用UE的自定义工具栏并借助开源工具astyle.exe来完成. 1. 首先下载最新的astyle,因为ue自带的astyle版本太老,不支持空格.中文名等. http://astyle.so ...

  4. random随机函数

    SQL> select * from (select ename,job from emp order by dbms_random.value() ) where rownum <5 2 ...

  5. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  6. bzoj1820

    水dp,状态表示三个司机当前在哪所用最小耗油,因为有一个一定在当前点所以可以压掉一维 ..,..] of longint;     a:..] of longint;     x,y,i,j,k,n, ...

  7. poj2886

    反素数范围不大,可以直接打表得然后就是模拟移动的过程我们可以用线段树优化,具体明天再说吧 ..] ,,,,,,,,,,,,,,                                  ,,, ...

  8. Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

  9. HDOJ 2012 素数判定

    Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x < y<=50),判定该表达式的值是否都为素数. I ...

  10. mysql in查询 结果乱序 引发的思考

    Mysql in查询 结果集 乱序 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3,4, ...