博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程通信:管道和socketpair的
阅读量:6517 次
发布时间:2019-06-24

本文共 2616 字,大约阅读时间需要 8 分钟。

  hot3.png

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

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

 

管道pipe的fd[2],其中fd[0]代表读端,fd[1] 代表写端,数据下标对应读写功能,不能更改顺序。

socketpair的fd[2] ,两种情况

    子进程: 使用 fd[0],close(fd[1])   父进程:使用:fd[1] ,close(fd[0])

    子进程: 使用:fd[1],close(fd[0])  父进程: 使用fd[0],close(fd[1])

 

详间代码:

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

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

 

转载于:https://my.oschina.net/manmao/blog/600019

你可能感兴趣的文章
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
JAVA Collections框架
查看>>
进制转换
查看>>
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
程序猿知道英语词汇
查看>>
数据存储(两)--SAX发动机XML记忆(附Demo)
查看>>
谈谈SQL 语句的优化技术
查看>>
深入分析面向对象中的封装作用
查看>>
深刻理解Python中的元类(metaclass)
查看>>
Android View体系(六)从源码解析Activity的构成
查看>>
fnmatch源码阅读
查看>>
U9249 【模板】BSGS
查看>>