socketpair实现进程通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

技术分享

#include<stdio.h>                                                                      
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<errno.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)
                {
            ssize_t _s;
            strcpy(buf,"hello bit");
            write(fd[1],buf,strlen(buf));
            _s=read(fd[1],buf,sizeof(buf)-1);
            buf[_s]=‘\0‘;
            printf("father->child%s\n",buf);
        }
        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);
            }
            strcpy(buf,"hello world");
            write(fd[0],buf,strlen(buf));
        }              
        close(fd[0]);
        //wait child
    }
    return 0;

运行截图:

技术分享

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1775706

以上是关于socketpair实现进程通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 socketpair 进行双向通信:挂起子进程的读取输出

高级进程间通信

Nginx之进程间的通信机制(Nginx频道)

多次使用 socketpair 函数的文件描述符时出现“错误的文件描述符”错误

资深程序员:深入Python进程间通信原理!

nginx中父子进程工作的主体函数