Linux多进程开发之匿名管道pipe()函数

/*

#include

int pipe(int pipefd[2]);

作用:创建一个匿名管道,用来进程间通信

参数:int pipefd[2] 这个数组是一个传出参数,

pipefd[0] 对应的是管道的读端

pipefd[1] 对应的是管道的写端

返回值:

成功返回 0, 失败返回-1并设置errno

管道默认是阻塞的,如果管道中没有数据,则read阻塞,如果管道中数据满了,则write阻塞。

注意:匿名管道只能用于具有关系的进程之间的通信(父子进程,兄弟进程,孙子进程)

*/

代码示例如下:

#include 
#include 
#include 
#include 
#include 

// 子进程发送数据给父进程,父进程读取数据后输出
int main(){

    //需要在fork()之前创建管道
    int pipefd[2] = {0};
    int pip = pipe(pipefd);
    if(pip == -1){
        perror("pipe");
        exit(0);
    }

    pid_t pid = fork();
    if(pid>0){
        //父进程
        //从管道的读取端读取数据
        char buf[1024]={0};
        while(1){
            
            read(pipefd[0], buf, sizeof(buf));
            printf("parent read data:%s, pid:%d, ppid:%d\n", buf, getpid(), getppid());
        }
        

    }else if(pid == 0){
        //子进程
        //从管道的写端写数据
        printf("child wrote data, pid:%d, ppid:%d\n", getpid(), getppid());
        while(1){
            char * data = "Hello, world!";
            write(pipefd[1], data, strlen(data));   
            printf("child wrote data:%s, pid:%d, ppid:%d\n", data, getpid(), getppid());
            sleep(1);
        }
        
    }else{
        perror("fork");
        exit(0);
    }

    return 0;

}

你可能感兴趣的:(linux,运维,服务器,c语言,c++)