进程的阻塞

一. 产生阻塞的原因

  • 1. 写入阻塞

    1. 如果没有进程从管道的读取端读取数据,写入操作会阻塞,直到有进程从管道的读取端读取数据为止。
    2. 如果输入缓冲区满了也会阻塞
  • 2. 读取阻塞

    1.如果读取端尝试从管道读取数据时,如果没有进程向管道的写入端写入数据,读取操作也会阻塞,直到有数据可读为止。
    2.当缓冲区为空时会阻塞

二. 管道什么时候是打开的

如果仅仅open管道文件不算打开管道,需要在open之后有read和write管道才算打开

三. 如何处理进程crush

  • 1.当输入端进程crush

    此时read函数会自动返回0,不会产生阻塞。** 可以用这个特性来检测是否接收端发生crush。**

  • 2.当接收端进程crush

    此时write函数会产生SIGPIPE错误信号,我们可以通过使用截取错误信号来检测处理该问题。

四. 管道文件不支持lssek

因为管道文件是一种流式通道,随机访问的话会造成进程间通讯数据的丢失。

五. 如何取消默认管道阻塞

  1. 使用fcntl函数
  2. 使用 open(PIPE, O_WRONLY | O_NONBLOCK);加参数O_NONBLOCK

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 22:46:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 22:46:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 22:46:03       58 阅读
  4. Python语言-面向对象

    2024-07-12 22:46:03       69 阅读

热门阅读

  1. 连接docker私有仓库

    2024-07-12 22:46:03       21 阅读
  2. React中的useCallback

    2024-07-12 22:46:03       19 阅读
  3. 【力扣C语言】每日一题—第50题,Pow(x,n)

    2024-07-12 22:46:03       22 阅读
  4. 使用 Spring Boot + POI 实现动态 DOCX 模版导出

    2024-07-12 22:46:03       23 阅读
  5. DelayQueue实现延时任务

    2024-07-12 22:46:03       18 阅读
  6. P1035 [NOIP2002 普及组] 级数求和 题解

    2024-07-12 22:46:03       20 阅读