zoukankan      html  css  js  c++  java
  • 进程间通信(IPC)-管道、匿名管道

         每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读出,内核提供的这种机制称为进程间通信。

    管道:基本的IPC机制由int pipe(filedes[2])函数创建,调用函数在内核开辟一段缓冲区(管道)用于通信,它有一个读端一个写端,然后 通 过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端,管道从用户角度看相当于打开一个文件,向文件读写数据其实是在读写内核缓冲区。

     

    管道的读写端需要打开文件描述符来传递,所以进程需要从公共祖先哪里继承文件描述符,所以通过管道通信需要有血缘关系。

    进程通过管道只能单向通信,有时需要父进程读,子进程写,有时需要子进程读,父进程写这就需要重新开管道。

     管道:

    命名管道

    文件系统中路径名是全局的,每个进程都可以访问,可以用文件系统中的路径名来标识一个IPC通道

    创建FIFO文件函数

    int mkfifo(const char *filename, mode_t mode);

    匿名管道:

    fifo写端

    fifo读端:

    管道的容量

    当管道一端不断地读取数据,另一端却不输出数据。根据linux的实现机制当管道读满是输出端自动阻塞。所以这个管道是有大小的

    现在我们编写程序来测试管道的大小

     当i=16的时候会阻塞,可知管道大小为64k

  • 相关阅读:
    ThinkPHP 小于5.0.24 远程代码执行高危漏洞 修复方案
    Nginx负载均衡配置与负载策略
    【高级】PHP-FPM和Nginx的通信机制
    快手、抖音、微视类短视频SDK接入教程,7步就能搞定
    我是怎么一步步用go找出压测性能瓶颈
    一个域名引发的血案……
    开发效率太低?您可能没看这篇文章
    想熟悉PostgreSQL?这篇就够了
    tee命令
    linux下常用的日志分析命令
  • 原文地址:https://www.cnblogs.com/Blog-day/p/My_Blog_Days_22.html
Copyright © 2011-2022 走看看