IPC之管道、FIFO、socketpair

2014-11-24 02:45:40 · 作者: · 浏览: 0

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


管道

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

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


FIFO (有名管道)

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

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


SocketPair

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

* 例子 [ SocketPair.cpp ]:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        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