温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

socketpair函数详解

发布时间:2020-06-27 02:03:48 来源:网络 阅读:7607 作者:小杨杨雪松 栏目:编程语言

我们先来看看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函数详解

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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI