socketpair学习笔记

原创 2016年05月31日 10:21:11

    最近在学习nginx,发现nginx父子进程之前通讯使用socketpair,memched也在使用socketpair。

    那就认真学习一下这种进程间的通讯方式吧。

    这是从unix网络编程第一卷中粘贴出来的



     

             socketpair 返回2个文件描述符  sockfd[0]是写文件,sockfd[1]是读文件。

          nginx在创建子进程之前就创建了socketpair文件描述符,fock 子进程之后,父子进程就会公用一个文件表项。

          《 文件表项是unix内核位进程打开文件创建的一个结构体,这个结构体存储文件状态,文件偏移                量,v节点指针信息。》unix 高级环境编程8.3中有详细介绍:

       

          

      最后是一个简单的socketpair 小例子:父进程写,子进程读的一个简单实例

  #include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <error.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
 
int main()

        int s[2]; 
        int w,r; 
        char * string = "This is a test socketpair program"; 
        char * buf = (char*)malloc(strlen(string)); 
        pid_t pid; 
 
        if( socketpair(AF_LOCAL,SOCK_STREAM,0,s) == -1 ){ 
                printf("create unnamed socket pair failed:%s\n",strerror(errno) ); 
                exit(-1); 
        } 
 
       
        if( ( pid = fork() ) > 0 ){ 
                printf("Parent process's pid is %d\n",getpid()); 
                close(s[1]); 
                if( ( w = write(s[0] , string , strlen(string) ) ) == -1 ){ 
                        printf("Write socket error:%s\n",strerror(errno)); 
                        exit(-1); 
                } 
        }else if(pid == 0){ 
                printf("Fork child process successed\n"); 
                printf("Child process's pid is :%d\n",getpid()); 
                close(s[0]); 
                
                if( (r = read(s[1], buf , sizeof(buf) )) == -1){ 
                  printf("Pid %d read from socket error:%s\n",getpid() , strerror(errno) ); 
                  exit(-1); 
               }
                printf("child read string in same process : %s \n",buf); 
        }else{ 
                printf("Fork failed:%s\n",strerror(errno)); 
                exit(-1); 
        } 
        
        printf("Test successed , %d\n",getpid()); 
        exit(0); 

还有一个疑问是《nginx高性web服务器详解》上面说linux IPC不适合事件驱动进程间的通讯。不知道为啥,哪位大神给解答一下


版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux网络编程 -- socketpair的使用

socketpair的使用Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。 该系统调用能创建一对已连接的UNIX族socket。 在Linux...
  • y396397735
  • y396397735
  • 2016年02月18日 10:49
  • 2496

进程通信:管道(pipe)和socketpair区别

管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工 socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写 详...
  • fangru
  • fangru
  • 2013年06月06日 17:50
  • 2480

将binder和socketpair结合实现任意进程间的双向通讯

binder机制是Android系统中特有的实现进程间远程通信的机制,它是基于C/S模式来实现的,一般一个是client端,一个是server端;而socketpair机制可以实现双向通讯,但是通讯范...
  • TECH_PRO
  • TECH_PRO
  • 2017年05月06日 07:47
  • 357

Linux下的socket编程实践(六)Unix域协议和socketpair传递文件描述符

UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所使用的API相同。UNIX域协议可以视为IPC方法之一,Unix域协...
  • NK_test
  • NK_test
  • 2015年10月13日 23:42
  • 2616

libevent源码学习(三)信号evsignal

libevent源码学习 之信号
  • zhangxiao93
  • zhangxiao93
  • 2017年05月16日 16:25
  • 337

Linux网络编程 -- socketpair的使用

socketpair的使用 Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。  该系统调用能创建一对已连接的UNIX族socket。  ...
  • ai2000ai
  • ai2000ai
  • 2016年09月20日 11:11
  • 269

socketpair创建双向通信的管道(全双工通信)

socketpair创建双向通信的管道(全双工通信)
  • Li_Ning_
  • Li_Ning_
  • 2016年08月06日 22:03
  • 1390

多进程并发编程----进程间传递文件描述符基础~socketpair函数简介

socketpair函数概要如下: #include #include int socketpair(int domain, int type, int protocol, int sv[2]);...
  • u010193457
  • u010193457
  • 2016年04月15日 17:13
  • 877

Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序

本篇博文主要介绍使用epoll和多进程的共享内存技术实现高性能的聊天室的服务器程序。#include #include #include #include #include #include...
  • u010193457
  • u010193457
  • 2016年03月28日 10:25
  • 1313

socketpair(双向通信)--高级IO

一、五种IO模型1、 阻塞I/O(eg:钓鱼者(王一)只钓鱼,不和任何人说话,也不干任何其他的事)2、非阻塞I/O (eg:钓鱼者(王二)一边钓鱼,一边问王一到底钓了多少鱼,但是王一并没有回答他,但他...
  • mm_hh
  • mm_hh
  • 2017年06月21日 17:55
  • 80
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socketpair学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)