zoukankan      html  css  js  c++  java
  • 管道

    管道,其本质是一个伪文件(实为内核缓冲区);由两个文件描述符引用,一个表示读端、一个表示写端;规定数据从管道的写端流入,读端流出。

      管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

      必须用于有血缘关系的进程

      

      管道的局限性:

      ① 数据自己读不能自己写。

      ② 数据一旦被读走,便不在管道中存在,不可反复读取。

      ③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

      ④ 只能在有公共祖先的进程间使用管道。

      常见的通信方式有,单工通信、半双工通信、全双工通信。

    pipe,创建管道

      int pipe(int pipefd[2]);  成功:0;失败:-1,设置errno

      函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] rfd[1] w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。

    示例:

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 
     4 int main(void)
     5 {
     6     int fd[2];
     7     pid_t pid;
     8     
     9     int ret = pipe(fd);     //定义管道  父进程占用两端
    10     if(ret == -1)
    11     {
    12         perror("pipe error");
    13         exit(1);
    14     }
    15     pid = fork();
    16     if(pid == -1)
    17     {
    18         perror("fork error");
    19         exit(1);
    20     }else if(pid == 0)//子进程(也占用了两端)    子进程读,将写端关闭    默认0读   1写
    21     {
    22         close(fd[1]);
    23         char buf[1024];
    24         ret read(fd[0], buf, sizeof(buf));    //将管道看作文件操作
    25         if(ret == 0){
    26             printf("----
    ");    //读完
    27         }
    28         write(STDOUT_FILENO,buf, ret);    //写到屏幕
    29     }else{    //父进程   关闭读端
    30         close(fd[0]);
    31         char *str = "hello pipe
    ";
    32         write(fd[1],"hello pipe
    ", strlen("hello pipe
    "));
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    015_stdc_C语言
    014_stdc_C语言
    013_stdc_C语言
    012C语言
    011_stdc_C语言
    010_stdc_C语言
    009_stdc_C语言
    008_stdc_C语言
    40.委托
    39.多线程
  • 原文地址:https://www.cnblogs.com/lr1402585172/p/10512838.html
Copyright © 2011-2022 走看看