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

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

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

详间代码:

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

[cpp]  view plain copy
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.   
  4. int main ()  
  5. {  
  6.     int fd1[2],fd2[2];  
  7.     pipe(fd1);  
  8.     pipe(fd2);  
  9.     if ( fork() ) {  
  10.         /* Parent process: echo client */  
  11.         int val = 0;  
  12.         close( fd1[0] );  
  13.         close(fd2[1]);  
  14.         while ( 1 ) {  
  15.             sleep( 1 );  
  16.             ++val;  
  17.             printf( "parent Sending data: %d\n", val );  
  18.             write( fd1[1], &val, sizeof(val) );  
  19.             read( fd2[0], &val, sizeof(val) );  
  20.             printf( "parent Data received: %d\n", val );  
  21.         }  
  22.     }  
  23.     else {  
  24.         /* Child process: echo server */  
  25.         int val ;  
  26.         close( fd1[1] );  
  27.         close(fd2[0]);  
  28.         while ( 1 ) {  
  29.             read( fd1[0], &val, sizeof(val) );  
  30.             printf( "son Data received: %d\n", val );  
  31.             ++val;  
  32.             write( fd2[1], &val, sizeof(val) );  
  33.             printf( "son send received: %d\n", val );  
  34.         }  
  35.     }  
  36. }  

输出结果: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实现父子进程全双工通信:

[cpp]  view plain copy
  1. #include <sys/types.h>  
  2. #include <sys/socket.h>  
  3.   
  4. #include <stdlib.h>  
  5. #include <stdio.h>  
  6.   
  7. int main ()  
  8. {  
  9.     int fd[2];  
  10.     int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );  
  11.     if ( r < 0 ) {  
  12.         perror( "socketpair()" );  
  13.         exit( 1 );  
  14.     }     
  15.     if ( fork() ) {  
  16.         /* Parent process: echo client */  
  17.         int val = 0;  
  18.         close( fd[1] );  
  19.         while ( 1 ) {  
  20.             sleep( 1 );  
  21.             ++val;  
  22.             printf( "parent Sending data: %d\n", val );  
  23.             write( fd[0], &val, sizeof(val) );  
  24.             read( fd[0], &val, sizeof(val) );  
  25.             printf( "parent Data received: %d\n", val );  
  26.   
  27.         }  
  28.     }  
  29.     else {  
  30.         /* Child process: echo server */  
  31.         int val ;  
  32.         close( fd[0] );  
  33.         while ( 1 ) {  
  34.             read( fd[1], &val, sizeof(val) );  
  35.             printf( "son Data received: %d\n", val );  
  36.             ++val;  
  37.             write( fd[1], &val, sizeof(val) );  
  38.             printf( "son send received: %d\n", val );  
  39.         }  
  40.     }  
  41. }  
输出结果: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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值