匿名管道-

匿名管道-_第1张图片匿名管道-_第2张图片匿名管道-_第3张图片因为父子进程是共享文件描述符的匿名管道-_第4张图片环形队列,只能读一次 会被后面覆盖匿名管道-_第5张图片

/*
    #include 
    int pipe(int pipefd[2]);
    功能:创建一个匿名管道,用于进程间通信
    参数:int 类型数组 ,是传出参数
        pipefd[0]是管道读端 
        pipefd[2]是管道写端
    返回值:成功 0
            失败 -1
    管道默认是阻塞的,如果管道中没有数据,read阻塞,如果通道满了,write阻塞
    匿名管道只能用于有关系的进程之间的通信(父子进程 兄弟进程)
*/
//子进程发数据给父进程
#include
#include
#include
#include
#include
int main() {
    //在fork之前创造管道
    int pipefd[2];
    int ret = pipe(pipefd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    pid_t pid = fork();
    if(pid > 0) {
        printf("parent process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            int len = read(pipefd[0], buf, sizeof(buf));
            printf("parent recv: %s, pid: %d\n", buf, getpid());
            char* str = "hello, i am parent";
            write(pipefd[1], str, strlen(str));
            sleep(1);
        }
        
    }else if(pid == 0) {
        printf("child process, pid: %d\n", getpid());
        char buf[1024] = {0};
        while(1) {
            char* str = "hello, i am child";
            write(pipefd[1], str, strlen(str));
            sleep(1);

            int len = read(pipefd[0], buf, sizeof(buf));
            printf("child recv: %s, pid: %d\n", buf, getpid());
        }
        
    }
    return 0;
}

有可能出现自己写自己读的现象

特点(假设都是阻塞态):

1.所有的指向管道写端的文件描述符都关闭了(管道写端引用计数为0),有进程从管道的读端读数据,那么当管道内部的数据被读取之后,再次read会返回0,就像读到文件末尾一样。

2.如果有指向管道写端的文件描述符没有关闭(管道的写端引用计数大于0)。而持有管道写端的进程也没有往管道中读取数据,这个时候有进程从管道中读取数据,那么管道中剩余的数据被读取后,再次read会堵塞,直到管道中有数据可以读了才读取数据并返回

3. 如果所有的指向管道读端的文件描述符关闭了(管道的读端引用计数0),这个时候向管道中写数据,那么该进程会受到信号SIGPIPE,导致进程异常终止。

4.如果有主席昂管道读端的文件描述符没有关闭(管道的读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时候有进程向管道中写数据,那么在管道被写满的时候再次write会堵塞,直到管道中有空位置。

匿名管道-_第6张图片

        

你可能感兴趣的:(Linux编程入门,linux)