socketpair学习笔记

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

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

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



     

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

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

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

       

          

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

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


你可能感兴趣的:(学习记录)