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

最近在总结之前做过的FTP服务器小项目时,突然想到服务进程和nobody进程之间的通信方式为什么不能采用其他方式时。查了点资料,总结就是socketpair和管道形式非常的类似,唯一的不同就是sockerpair支持全双工,这样在进程之间发送数据的时候变得非常的简单方便。

管道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


©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页