gzyueqian
13352868059

粤嵌嵌入式linux基本教程培训 有名管道的堵塞问题

更新时间: 2019-01-02 14:23:43来源: 粤嵌教育浏览量:3939

  嵌入式Linux基本教程中,Linux有名管道的堵塞是一个令人困扰的问题,下面我们就来讲一下这个问题是如何产生的,以更好地掌握其内部的逻辑关系。

  一、问题由来

  在先前操作有名管道相关试验时,发现有名管道中存在有堵塞的问题,该堵塞是在调用open函数打开有名管道文件时发生,具体表现形式如下:

  情况一:

  有两份代码jack和rose,其通过编译运行实现两个进程之间的通信,两份代码均为调用open函数打开有名管道文件,其中jack作为数据读取进程,用于读取rose发送过来的数据,且jack中open的有名管道打开方式是以只读方式打开,rose中的open有名管道的打开方式是以只写方式打开,部分代码书写如下:

  Jack部分

    

  Rose部分

    

  嵌入式Linux基本教程在Linux中如只先运行其中的某个程序时,不能得到打印信息,但两个程序都执行后,Linux终端上得到两端的提示信息打印。如图1、2

    

  图1 只有一端执行时表现形式

  图2 两端执行时表现形式

  情况二:

  两份代码jack和rose,调用open函数打开有名管道时,如的打开的方式为可读可写方式(O_RDWR),则open函数再会堵塞,提示信息直接打印。部分代码如下

  Jack部分代码

    

  Rose部分代码

 

  图示如图2


    

  情况总结:

  调用 open()打开有名管道的进程open函数处可能会被阻塞。但如果同时以读写方式 (O_RDWR)打开,则一定不会导致阻塞;如果以只读方式 ( O_RDONLY ) 打开,则调用 open() 函数的进程将会被阻塞直到有写方打开管道;同样以写方式 ( O_WRONLY ) 打开也会阻塞直到有读方打开管道。

  二、问题原因

  在用open打开FIFO时有可能会阻塞,原因就是当前只有读端或写端存在。换句话说,如果程序在打开FIFO时指定了只读方式/只写方式,那么该进程对于打开的FIFO来说就是一个读端/写端。如果指定的是读写方式,那么进程即是读端又是写端。嵌入式Linux基本教程表示这就好比如是一根水管,当水管的两端都打开时,水管才能通水,反之只要有一端不同,水管就会堵塞。

  三、有名管道读写数据问题

  从FIFO中读数据时(用read函数),如果没有数据,默认是阻塞等待,直到有数据被写入FIFO。如果read函数返回0,说明该FIFO所有的写端都已关闭,程序要做相应的处理。向FIFO写入数据时(使用write函数),如果FIFO有足够空间,write函数会返回写入的字节数;如果空间不够,write函数会阻塞,直到写完为止。当所有的读端都关闭时,再向FIFO写数据会出错。内核会向写进程发管道断裂的信号(SIGPIPE), 从而终止该进程。

  有关嵌入式Linux基本教程中Linux有名管道的堵塞问题就先说到这里,如果感兴趣的话,可以到粤嵌系统培训相关的知识。


免费预约试听课