验证多个孩子进程进程socketpair竞争读

  问题:当父进程创建了一个全双工管道socketpair,然后fork了两个孩子,这两个孩子都将进程这个无命名管道,若父进程往socketpair写数据,那么子进程谁接受到这个数据?

验证结果是:只有一个孩子进程接收到数据,具体哪个孩子看系统负载情况

#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<iostream>
#include<assert.h>
#include<sys/wait.h>
#include<stdlib.h>
using namespace std;
int main(){
    int fd[2];
    int pid[2];
    int ret=socketpair(AF_UNIX,SOCK_STREAM,0,fd);
    assert(ret!=-1);
    if((pid[0]=fork())<0){
        cout<<"fork 1 error"<<endl;
    }
    else if(pid[0]>0){//父进程再创建孩子2
        if((pid[1]=fork())<0){
            cout<<"fork 2 error"<<endl;
        }
        else if(pid[1]>0){//父进程写管道
            close(fd[1]);
            write(fd[0],"parent write",20);
            waitpid(pid[0],NULL,0);
            waitpid(pid[1],NULL,0);
            cout<<"parent wait success"<<endl;
        }
        else{//孩子进程2
            sleep(1);//孩子进程2若执行这句并且孩子1未休眠则孩子1接收到数据
            close(fd[0]);
            char buf[20];
            int ret=read(fd[1],buf,20);
            assert(ret!=-1);
            cout<<"child 2 read parent's data:: "<<buf<<endl;
            exit(0);
        }
    }
    else{
        //sleep(1);//孩子1休眠并且孩子2未休眠则孩子2接收到数据
        close(fd[0]);
        char buf[20];
        int ret=read(fd[1],buf,20);
        assert(ret!=-1);
        cout<<"child 1 read parent's data:: "<<buf<<endl;
        exit(0);
    }
    return 0;
}

验证多个孩子进程进程socketpair竞争读_第1张图片

图中第一个红框是孩子1休眠孩子2接收到数据

图中第二个红框是孩子2休眠孩子1接收到数据

若不人为控制孩子休眠最后接收情况未定义。

你可能感兴趣的:(验证多个孩子进程进程socketpair竞争读)