socketpair函数详解
2016-05-22 19:31
1556 查看
我们先来看看socketpair函数的原型如下:
int socketpair(int domain,int type,int protocol,int sv[])
第一个参数表示协议族,必须为AF_LOCAL;
第二个参数表示类型,既可以是SOCK_STREAM,又可以是SOCK_DGRAM,当参数指定为SOCK_STREAM时,得到的结果称为流管道,它与一般管道的区别是留管道是全双工的,即两个描述符即可读有可写;
第三个参数只能为0;
第四个参数用于保存创建的套接字对;
socketpair函数建立一对匿名的已连接的套接字,建立的两个套接字描述符会放在sv[0]和sv[1]中。既可以从sv[0]写入sv[1]读出,又可以从sv[1]读入sv[0]写出,如果没有写入就读出则会生阻塞。用途:用来创建全双工通道,不过只局限于父子进程之间。
下面我们通过一段代码来看看这个函数的用法:
我们可以看到,父子进程通过socketpair函数创建的全双工管道实现了进程间的通信,彼此都能收发信息,但要注意:父子进程在通信的时候,必须关闭一个描述符号,是因为一个在写的时候另一个只能读。
int socketpair(int domain,int type,int protocol,int sv[])
第一个参数表示协议族,必须为AF_LOCAL;
第二个参数表示类型,既可以是SOCK_STREAM,又可以是SOCK_DGRAM,当参数指定为SOCK_STREAM时,得到的结果称为流管道,它与一般管道的区别是留管道是全双工的,即两个描述符即可读有可写;
第三个参数只能为0;
第四个参数用于保存创建的套接字对;
socketpair函数建立一对匿名的已连接的套接字,建立的两个套接字描述符会放在sv[0]和sv[1]中。既可以从sv[0]写入sv[1]读出,又可以从sv[1]读入sv[0]写出,如果没有写入就读出则会生阻塞。用途:用来创建全双工通道,不过只局限于父子进程之间。
下面我们通过一段代码来看看这个函数的用法:
#include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> int main() { int sv[2]={0,0}; int sock=socketpair(AF_LOCAL,SOCK_STREAM,0,sv); if(sock<0) { perror("socketpair"); exit(0); } pid_t id=fork(); char buf[1024]; if(id<0) { perror("fork"); exit(0); } else if(id==0) { close(sv[0]); //子进程关闭读端 while(1) { memset(buf,'\0',sizeof(buf)); strcpy(buf,"i am your child"); write(sv[1],buf,strlen(buf));//子进程写入 memset(buf,'\0',sizeof(buf)); ssize_t _s=read(sv[1],buf,sizeof(buf)-1);//子进程读取父进程的内容 buf[_s]='\0'; printf("father-->child:%s\n",buf); sleep(1); } close(sv[1]);//子进程关闭读端 } else {//父进程 close(sv[1]); while(1) { memset(buf,'\0',sizeof(buf)); ssize_t _s=read(sv[0],buf,sizeof(buf)-1); buf[_s]='\0'; printf("child-->father:%s\n",buf); memset(buf,'\0',sizeof(buf)); strcpy(buf,"i am your father"); write(sv[0],buf,strlen(buf)); sleep(1); } close(sv[0]); } return 0; }我们看看运行结果:
我们可以看到,父子进程通过socketpair函数创建的全双工管道实现了进程间的通信,彼此都能收发信息,但要注意:父子进程在通信的时候,必须关闭一个描述符号,是因为一个在写的时候另一个只能读。
相关文章推荐
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Sql Server中REPLACE函数的使用
- PowerShell函数简明教程