CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 漏洞列表
  3. 正文

socketpair-2020/8/15

2020年8月15日 321点热度 0人点赞 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
#include
#include
#include
#include
#include

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;
}
我们看看运行结果:

wKioL1dBmIWwl6YVAAA41_vtYWQ542.png

我们可以看到,父子进程通过socketpair函数创建的全双工管道实现了进程间的通信,彼此都能收发信息,但要注意:父子进程在通信的时候,必须关闭一个描述符号,是因为一个在写的时候另一个只能读。0daybank

标签: 暂无
最后更新:2020年8月15日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me