[转] IPC之管道、FIFO、socketpair

管道和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
时间: 2024-11-10 00:12:04

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

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

整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管

linux中的命名管道FIFO

匿名管道pipe前面已经说过了,接下来就说命名管道FIFO: 我们可以使用以下函数之一来创建一个命名管道,他们的原型如下:#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *filename, mode_t mode);int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);这两个函数都能创建个FIFO,   注意是创建一个真实存

IPC: 管道

#################################################### 管道(管道都是单向的半双工数据流) 管道分类: 1.无名管道:只能在具有共同祖先的进程间使用. 2.命令管道:可以在无论是否有亲缘关系的进程间使用,只能在同一主机上使用. 无名管道使用fcntl设置非阻塞模式, 有名管道可以使用open活fcntl设置非阻塞模式. 管道和fifo的限制: OPEN_MAX :一个进程在任意时刻打开的最大描述符数: PIPE_BUF :可原子的写往一个管道或f

简述Linux进程间通信之命名管道FIFO

上文聊到管道(pipe),可以使有亲缘关系的进程间进行通信. 对于没有亲缘关系的进程如何通信?本文来聊一聊命名管道FIFO. 一.概念 命名管道FIFO,提供一个路径名与之关联,以文件形式存储于文件系统中. 一个进程以r方式打开,另一个程序以w方式打开,即可在两个进程之间建立管道. 通过以fifo文件作为媒介,可以使任意两个进程通过该文件进行通信. 命名管道(fifo)特性与管道(pipe)类似,不必赘述. 下面我们看FIFO如何进行进程间通信,首先来介绍一下所用到的函数: 二.函数原型 #in

Linux编程 — IPC之管道

管道,一种古老的进程间通信形式.一个管道由一个进程创建,然后该进程调用fork,此后父.子进程就可以用管道通信了. 函数原型: #include <unistd.h> int pipe(int filedes[2]); // 成功返回0,出错返回-1 参数filedes返回两个文件描述符.filedes[0]用来输入,filedes[1]用来输出.注意,经过实验,这里的两个描述符并不对应标准输入和标准输出.下面是一个简单的测试例程: #include <stdio.h> #incl

Linux IPC之管道和FIFO

导言:管道是UNIX系统上最古老的IPC方法,管道提供了一种优雅的解决方案:给定两个运行不同程序的进程,在shell中如何让一个进程的输出作为另一个进程的输入?管道可以用来在相关(一个共同的祖先进程创建管道)进程之间传递数据.FIFO是管道概念的一个变体,它们之间的一个重要差别在于FIFO可以用于任意进程间的通信. 概述 每个shell用户都对在命令中使用管道比较熟悉,例如,统计一个目录中文件的数目: ls | wc -l 解释:为了执行上面的命令,shell创建了两个进程来分别执行ls和wc(

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

管道 管道是Unix系统IPC的最古老方式,有两种局限性: (1)   历史上它们是半双工的(即数据只能在一个方向上流动),虽然现在某些系统提供了全双工管道,但是为了可移植性,不要抱有绝对的全双工假设. (2)   管道只能在具有公共祖先的两个进程之间使用(一般都是用于父子进程之间). 管道是通过调用pipe函数创建的: #include <unistd.h> int pipe(int fd[2]); 返回值:成功,返回0:失败,返回-1 说明: fd返回两个文件描述符:fd[0]用于读,fd

进程间通信IPC—匿名管道(pipe)和命名管道(fifo)

管道内部如何实现-大小,组织方式,环形队列? 一.进程间通信有多种方式,本文主要讲解对管道的理解.管道分为匿名管道和命名管道. (1)管道( pipe ):又称匿名管道.是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. (2)命名管道 (named pipe或FIFO) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. 二.管道 1. 管道的特点: (1)管道是半双工的,数据只能向一个方向流动:双方通信时,需要

Linux下的进程通信方式(IPC)——管道通信

Unix IPC: 管道.命名管道(FIFO)      管道 1.概念 管道是单向的(半双工).先进先出.无结构的字节流,它把一个进程的输出和另一个进程的输入连接在一起. 写进程在管道的尾端写入数据,读进程在管道的首端读出数据.数据读出后将从管道中移走,其它读进程都不能再读到这些数据. 管道提供了简单的流控制机制.进程试图读一个空管道时,在数据写入管道前,进程将一直阻塞.同样,管道已经满时,进程再试图写管道,在其它进程从管道中读走数据之前,写进程将一直阻塞. 2.管道的特点 (1)单向数据通信