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不适合事件驱动进程间的通讯。不知道为啥,哪位大神给解答一下


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

相关文章推荐

信息系统管理工程师学习笔记

  • 2017年11月09日 11:12
  • 1.28MB
  • 下载

卷积神经网络学习笔记

  • 2017年11月16日 17:11
  • 133KB
  • 下载

socketpair理解

今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测!      先说说我的理解:socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于...

邹波老师Hibernate教程学习笔记

  • 2017年11月10日 15:53
  • 531KB
  • 下载

Servlet学习笔记

  • 2017年11月11日 20:50
  • 1.38MB
  • 下载

socketpair和dup---高级I/O

一、我们在学习进程间通信的时候学习过匿名管道pipe,匿名管道的特点: 只能用于单向通信 只能用于有血缘关系的两个进程,通常是父子进程 生命周期随进程 面向字节流 具有同步机制 我们现在学习一种新的管...

redis学习笔记+练习springboot-redisdemo

  • 2017年11月10日 11:45
  • 1.36MB
  • 下载

高级I/O函数之socketpair

pipe函数可用于创建一个管道,以实现进程间的通信。但是单个管道只能单向通信,一端用于读,一端用于写。若要实现双向通信,必须创建一对管道。而socketpair函数能够创建双向管道。 int sock...

Spark学习笔记一

  • 2017年11月09日 08:38
  • 206KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socketpair学习笔记
举报原因:
原因补充:

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