天天看点

socketpair

pipe用来创建管道,但是单个管道只能进行单向通信,一顿用于读,一段用于写,如果要实现进程双向通信,必须创建一对管道。

而socketpair则可以用来创建双向通信的管道具体实现如下:

实现,打开的还是一个文件,fd[0],fd[1],管道中f[0]读端,f[1]写端。

#include <sys/types.h>   

#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);

domain:选用AF_LOCAL;

type:SOCK_STREAM

protocol:默认0

socketpair
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>

int main()
{
  int fd[2];
  if(socketpair(AF_LOCAL,SOCK_STREAM,0,fd)<0){
    perror("sockpair");
    return 1;
  }
  pid_t id=fork();
  if(id<0){
    perror("fork");
    return 2;
  }
  else if(id==0)
  {
    close(fd[0]);
    char buf[1024];
    while(1)
    {
      strcpy(buf,"hello world");
      write(fd[1],buf,strlen(buf));
      ssize_t _s=read(fd[1],buf,sizeof(buf)-1);
      buf[_s]='\0';
      printf("father->child:%s\n",buf);
      sleep(1);
    }
    close(fd[1]);
  }
  else
  {
    close(fd[1]);
    char buf[1024];
    while(1)
    {
      ssize_t _s=read(fd[0],buf,sizeof(buf)-1);
      if(_s>0)
      {
        buf[_s]='\0';
        printf("child->father:%s\n",buf);
        sleep(1);
      }
      strcpy(buf,"hello mygirl");
      write(fd[0],buf,strlen(buf));
    }
    close(fd[0]);

  }
  return 0;
}