十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
socketpair
创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为武强企业提供专业的成都做网站、网站建设、外贸营销网站建设,武强网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
socketpair:相比较之前提到的管道,socketpair是一个全双工的通信方式,它的一端即可以读也可以写,对于它我是这样理解的:
假设现在我们是在本地使用socketpair的,客户端为fd[0],服务器端为fd[1],当服务器向客户端写数据时,从fd[1]的写端写入数据,而从fd[1]的读端读取数据,反之从客户端上的操作也是如此。
下面是实现的一个socketpair版本地进程间通信
#include/* See NOTES */ #include int socketpair(int domain, int type, int protocol, int sv[2]);
domian为操作的方式,因为我们是本地所以用AF_LOCAL。
type为传输方式,我们采用tcp的流式服务,SOCK_STREAM。
protocol为控制,我们选择默认填0,
sv为要创建多少个文件描述符,注意(这个文件描述符是网络文件描述符,可以说他是虚拟的)。
1 #include2 #include 3 #include 4 #include 5 #include 6 int main() 7 { 8 int fd[2]; 9 if(socketpair(AF_LOCAL,SOCK_STREAM,0,fd)<0) 10 { 11 perror("socketpair"); 12 } 13 char buf[1024]; 14 pid_t id=fork(); 15 if(id<0){ 16 perror("fork"); 17 }else if(id==0){ 18 close(fd[0]); 19 while(1) 20 { 21 sleep(1); 22 memset(buf,'\0',sizeof(buf)-1); 23 strcpy(buf,"child hello world"); 24 write(fd[1],buf,strlen(buf)+1); 25 ssize_t size=read(fd[1],buf,sizeof(buf)-1); 26 if(size>0) 27 { 28 buf[size]='\0'; 29 printf("parents say::%s\n",buf); 30 } 31 } 32 close(fd[1]); 33 } 34 else{ 35 close(fd[1]); 36 while(1) 37 { 38 sleep(2); 39 ssize_t size=read(fd[0],buf,sizeof(buf)-1); 40 if(size>0) 41 { 42 buf[size]='\0'; 43 printf("child say::%s\n",buf); 44 } 45 memset(buf,'\0',sizeof(buf)); 46 strcpy(buf,"parent hello world"); 47 write(fd[0],buf,strlen(buf)+1); 48 } 49 close(fd[0]); 50 51 } 52 53 return 0; 54 }
socketpair实现了全双工的通信方式。