管道

    #include <unistd.h>
    int pipe(int pipefd[2]);
        功能:创建一个匿名管道,用来进程间通信。
        参数:int pipefd[2] 这个数组是一个传出参数。
            pipefd[0] 对应的是管道的读端
            pipefd[1] 对应的是管道的写端
        返回值:
            成功 0
            失败 -1
  • 管道默认是阻塞的:如果管道中没有数据,read阻塞,如果管道满了,write阻塞
  • 注意:匿名管道只能用于具有关系的进程之间的通信(父子进程,兄弟进程)

写管道

char *buf[1024];
write(fd[1],buf,sizeof(buf));

读管道

while ((len = read(fd[0], buf, sizeof(buf) - 1)) > 0) {
            printf("%s", buf);
            memset(buf, 0, 1024);
        }

管道重定向

while ((len = read(fd[0], buf, sizeof(buf) - 1)) > 0) {
            printf("%s", buf);
            memset(buf, 0, 1024);
        }

管道的读写特点

  1. 所有的指向写端的文件描述符都关闭了(写端引用计数都为0),那么管道中剩余的数据被读取以后,再次read会返回0,(read错误会返回-1),就像读到文件末尾一样。
  2. 如果写端引用计数大于0,而没有往管道里写数据,管道里没数据的时候会那么read会阻塞,直到管道中有数据可以读了才读取数据并返回;
  3. 如果读端引用计数为0,有进程往里写数据就会收到一个信号SIGPIPE,通常会导致进程异常终止;
  4. 如果读端应用技术大于0,在管道被写满之后write会阻塞,直到管道中有空位置才能再次写入数据并返回;
总结
  • 读管道:
    1. 管道中有数据:read返回读到的字节数
    2. 无数据:
      写端被全部关闭:返回0
      没有完全关闭:read阻塞
  • 写管道:
    1. 读端全部关闭:进程异常终止
    2. 读端未完全关闭:
      1. 管道已满:write阻塞
      2. 管道未满:write将数据写入,返回写入字节数。
posted @ 2021-03-29 17:14  tao10203  阅读(160)  评论(0)    收藏  举报