管道

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

#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. 【转】不同VLAN之间相互通信及VTP、STP、EtherChannel概念

    厘清最后一个概念. 转了网上两个相关帖子: http://www.net130.com/CMS/Pub/Tech/tech_zh/2009_03_12_97386_3.htm http://blog. ...

  2. Java语言基础(五) Java原始数据类型的分类以及数据范围

    Java原始数据类型的分类以及数据范围 1.基本数据类型分为:整型(byte, short, int, long),浮点型(float, double),字符型(char),布尔型(boolean) ...

  3. Java随机数

    本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 广义上讲,Java中的随机数的有三种产生方式:(01). 通过System.currentTimeMillis()来获取一个当前时间 ...

  4. python手记(30)

    #!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test3.png" ...

  5. So many interfaces!

    http://stackoverflow.com/questions/4817369/why-does-does-it-really-listt-implement-all-these-interfa ...

  6. [LeetCode#263]Factorial Trailing Zeroes

    Problem: Write a program to check whether a given number is an ugly number. Ugly numbers are positiv ...

  7. jqGrid简单介绍

    一.要引用的文件 要使用jqGrid,首先页面上要引入如下css与js文件. 1.css <link href="/css/ui.jqgrid.css" rel=" ...

  8. HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  9. assembly的说明

    Assembly SampleAssembly; // Instantiate a target object. Int32 Integer1 = new Int32(); Type Type1; / ...

  10. uva1393 Highways

    留坑(p.339) 已填(膜汪) 每条直线至少经过两个点,我们不妨在经过的所有点中的第二个点统计它 设f[i][j]表示i * j的答案,那么显然可以用f[i][j] = f[i - 1][j] + ...