进程通信:管道(pipe)和socketpair区别

原创 2013年06月06日 17:50:40

管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工

socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写

详间代码:

一:pipe实现父子进程全双工通信:

#include <stdlib.h>
#include <stdio.h>

int main ()
{
    int fd1[2],fd2[2];
    pipe(fd1);
    pipe(fd2);
    if ( fork() ) {
        /* Parent process: echo client */
        int val = 0;
        close( fd1[0] );
        close(fd2[1]);
        while ( 1 ) {
            sleep( 1 );
            ++val;
            printf( "parent Sending data: %d\n", val );
            write( fd1[1], &val, sizeof(val) );
            read( fd2[0], &val, sizeof(val) );
            printf( "parent Data received: %d\n", val );
        }
    }
    else {
        /* Child process: echo server */
        int val ;
        close( fd1[1] );
        close(fd2[0]);
        while ( 1 ) {
            read( fd1[0], &val, sizeof(val) );
            printf( "son Data received: %d\n", val );
            ++val;
            write( fd2[1], &val, sizeof(val) );
            printf( "son send received: %d\n", val );
        }
    }
}

输出结果:parent Sending data: 1
son Data received: 1
son send received: 2
parent Data received: 2
parent Sending data: 3
son Data received: 3
son send received: 4

parent Data received: 4


一:soketpair实现父子进程全双工通信:

#include <sys/types.h>
#include <sys/socket.h>

#include <stdlib.h>
#include <stdio.h>

int main ()
{
    int fd[2];
    int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
    if ( r < 0 ) {
        perror( "socketpair()" );
        exit( 1 );
    }   
    if ( fork() ) {
        /* Parent process: echo client */
        int val = 0;
        close( fd[1] );
        while ( 1 ) {
            sleep( 1 );
            ++val;
            printf( "parent Sending data: %d\n", val );
            write( fd[0], &val, sizeof(val) );
            read( fd[0], &val, sizeof(val) );
            printf( "parent Data received: %d\n", val );

        }
    }
    else {
        /* Child process: echo server */
        int val ;
        close( fd[0] );
        while ( 1 ) {
            read( fd[1], &val, sizeof(val) );
            printf( "son Data received: %d\n", val );
            ++val;
            write( fd[1], &val, sizeof(val) );
            printf( "son send received: %d\n", val );
        }
    }
}
输出结果:parent Sending data: 1
son Data received: 1
son send received: 2
parent Data received: 2
parent Sending data: 3
son Data received: 3
son send received: 4

parent Data received: 4



进程通信:管道(pipe)和 unix域套接字(socketpair)区别

管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工 socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个...
  • p656456564545
  • p656456564545
  • 2016年01月13日 22:27
  • 1474

进程间通信:管道和socketpair的区别

最近在总结之前做过的FTP服务器小项目时,突然想到服务进程和nobody进程之间的通信方式为什么不能采用其他方式时。查了点资料,总结就是socketpair和管道形式非常的类似,唯一的不同就是sock...
  • PirLCK
  • PirLCK
  • 2016年09月13日 15:44
  • 1084

PIPE和socketpair的区别

2013年04月19日 ⁄ 综合 ⁄ 共 1580字 ⁄ 字号 小 中 大 ⁄ 评论关闭 管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。soc...
  • u010064842
  • u010064842
  • 2016年02月20日 15:54
  • 624

进程间通信-管道(PIPE)和有名管道(FIFO)

前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立。进程与进程间不能像线程间通过全局变量通信。 如果想进程间通信,就需要其他机制。          常用的进程间通信方式有这...
  • w616589292
  • w616589292
  • 2016年03月22日 18:52
  • 2316

Linux上实现双向进程间通信管道(socketpair)

Linux 提供了 popen 和 pclose 函数,用于创建和关闭管道与另外一个进程进行通信。其接口如下: FILE *popen(const char *command, const ...
  • kobejayandy
  • kobejayandy
  • 2014年01月28日 22:51
  • 13669

进程间通信:管道(pipe)

管道的概述 管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。 无名管道有如下特点: 1、半双工...
  • lianghe_work
  • lianghe_work
  • 2015年08月16日 23:19
  • 4403

Python进程间通信之匿名管道

匿名管道管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端.os.pipe()返回2个文件描述符(r, w),...
  • csujiangyu
  • csujiangyu
  • 2015年04月09日 10:26
  • 2456

进程间通信(4) - 管道(pipe)

1. 前言   本篇文章的所有例子,基于RHEL6.5平台。本篇只介绍管道(匿名管道/普通管道),命名管道在后续文章中会介绍。 2.管道特性 管道是Linux支持的最初Unix IPC形式之一,具...
  • shltsh
  • shltsh
  • 2015年06月16日 23:24
  • 3534

Windows管道通信实现进程通信

Windows下用管道通信(pipe)实现进程间数据共享管道是一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计采用数据流I/0的方式来访问。由一个进程读、另...
  • demon_xiao
  • demon_xiao
  • 2015年04月22日 17:19
  • 5776

运用管道(pipe)进行进程间通信

   在linux系统中,管道是一种特殊的文件,它的主要作用是实现进程间的通信。    管道的一个显著特点是:当一个管道建立后,将获得两个文件描述符,分别用于对管道读取和写入...
  • mazheng1989
  • mazheng1989
  • 2012年03月11日 14:46
  • 674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程通信:管道(pipe)和socketpair区别
举报原因:
原因补充:

(最多只允许输入30个字)