socketpair
socketpair:相比较之前提到的管道,socketpair是一个全双工的通信方式,它的一端即可以读也可以写,对于它我是这样理解的:
假设现在我们是在本地使用socketpair的,客户端为fd[0],服务器端为fd[1],当服务器向客户端写数据时,从fd[1]的写端写入数据,而从fd[1]的读端读取数据,反之从客户端上的操作也是如此。
下面是实现的一个socketpair版本地进程间通信
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
domian为操作的方式,因为我们是本地所以用AF_LOCAL。
type为传输方式,我们采用tcp的流式服务,SOCK_STREAM。
protocol为控制,我们选择默认填0,
sv为要创建多少个文件描述符,注意(这个文件描述符是网络文件描述符,可以说他是虚拟的)。
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<unistd.h>
5 #include<string.h>
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实现了全双工的通信方式。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。