管道和FIFO作为最初的UNIX IPC形式,现在已用得较少。SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记


管道

* 只用于有亲缘关系的进程间通信
* 单向,即半双工 (双向方法:1 使用2个管道 2 使用SocketPair)

* pipe() => write()/read()

FIFO (有名管道)

* 可用于无亲缘关系的进程间通信
* 单向

* mkfifo() => open() => write()/read()

SocketPair

* 套接字(一般用于网络通讯)提供的一种用于本机进程间通信方式
* 双向,即全双工
* socketpair() => write()/read()

* 例子 [ SocketPair.cpp ]:

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
const int MAXSIZE = 100; int main()
{
int fd[2];
int rLen;
char wBuf[MAXSIZE] = "Hello World";
char rBuf[MAXSIZE]; if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0)
{
cout << "SocketPair Err" << endl;
return -1;
} pid_t pid = fork();
if (pid < 0)
{
cout << "Fork Err" << endl;
return -1;
} if (pid == 0)
{
// Chlid
cout << "Child, Pid=" << getpid() << endl;
write(fd[0], wBuf, strlen(wBuf));
write(fd[1], wBuf, strlen(wBuf));
exit(-1);
} // Parent
sleep(1);
cout << "Parent, Pid=" << getpid() << endl;
rLen = read(fd[1], rBuf, MAXSIZE);
rBuf[rLen] = 0;
cout << "Read Fd[1], rBuf : " << rBuf << endl;
rLen = read(fd[0], rBuf, MAXSIZE);
rBuf[rLen] = 0;
cout << "Read Fd[0], rBuf : " << rBuf << endl;
return 0;
}
# g++ SocketPair.cpp
# ./a.out
Child, Pid=9569
Parent, Pid=9568
Read Fd[1], rBuf : Hello World
Read Fd[0], rBuf : Hello World

[转] IPC之管道、FIFO、socketpair的更多相关文章

  1. 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

  2. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  3. 命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

  4. 进程间通信(IPC)-管道、匿名管道

    每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读 ...

  5. Linux学习笔记25——命名管道(FIFO)

    1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...

  6. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  7. 进程间通信___命名管道(FIFO)

    命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...

  8. Linux 进程间通信(一)(经典IPC:管道、FIFO)

    管道 管道是Unix系统IPC的最古老方式,有两种局限性: (1)   历史上它们是半双工的(即数据只能在一个方向上流动),虽然现在某些系统提供了全双工管道,但是为了可移植性,不要抱有绝对的全双工假设 ...

  9. linux IPC总结——管道

    管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ...

随机推荐

  1. python下 help()使用方法

    查看python所有的modules:help("modules") 单看python所有的modules中包含指定字符串的modules: help("modules ...

  2. TalkingData Cocos2dx在android平台使用总结

    前言:最近发现很多朋友在使用TalkingData游戏版本Cocos2dx SDK使用过程中会出现的一些问题,今天来做一下总结,希望对您有所帮助: 首先非常感谢您使用TalkingData游戏统计平台 ...

  3. linux c最简单的加密程序

    最初的密码程序是在Hirst First c里面看到的,大概内容如下:对待加密的字符串的每一个字符和某个数值进行一次按位异或得到密文,再进行一次按位异或得到明文. 补充知识:按位异或的结果是“同位得1 ...

  4. Zend Cache的学习和实例

    前一段时间,公司让我组织一下关于Zend Cache的培训. 培训的具体内容有: 前端core缓存 前端Output缓存 前端Function缓存 前端Class缓存 前端File缓存 前端Page缓 ...

  5. Node.js 入门(2)

    1.http 请求 //调用Node.js自带的http模块 var http = require("http"); //调用http模块提供的函数createServer htt ...

  6. 分析智能卡的ATR格式

    一些例子 NXP 080=========3b f8 T0   Y1 = 0xF(TA1, TB1, TC1, TD1), K = 813 TA1 F = 0x1(Fi = 372, Fmax = 5 ...

  7. Qt_chartdirector图形开发

    ChartDirector 是一款商业的图表库,有多种语言的版本,使用它做的图表非常的精 细漂亮,提供免费版本,但会出现logo信息.网上有很多关于它的破解方法. 一.产品优点 高效快捷 采用多线程结 ...

  8. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  9. Windows8.1 preview硬盘安装(图解)

    本人小本系统是win7 32位的,想要装win8 64位 ,想直接镜像安装不可能,因为位数不同.U盘只有2G ,显然也放不下3.6G的win8系统.借助NT6 HDD Installer,可以在本地硬 ...

  10. 7.3.2 Using Backups for Recovery 使用备份用于恢复

    7.3.2 Using Backups for Recovery 使用备份用于恢复 现在,假设我们有一个灾难性的crash 在星期三上午8点. 需要恢复从备份恢复,为了恢复,我们首选需要恢复最近的全备 ...