您当前的位置: 首页 > 

进程间通信(四)有名管道

发布时间:2021-08-10 21:40:32 ,浏览量:6

有名管道解决了无名管道进程只能是具有情缘关系的问题。

一、有名管道

无名管道是临时的,通信完成后自行消失。有名管道或者叫做命名管道(named pipe),可以实现没有亲缘关系的进程间通信,方法是使用FIFO文件。

1.1 shell中使用有名管道

一般而言,Linux中的fifo文件存储在/tmp/my_fifo, shell中可以直接创建fifo:

sudo mkfifo abc

然后进行读取和写入:

cat < /tmp/abc & #让FIFO立刻打印收到的内容 echo "Hello world" > /tmp/abc #需要root权限,注意不是sudo权限 

cat < filename将文件的内容打印至标准输出,如果此时另一进程将内容写至fifo文件可以直接在终端观察到管道的内容。

1.2 mkfifo创建有名管道

除了在shell中直接创建外,在C/C++程序中使用mkfifo接口创建:

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

输入参数:

const char * filename 要打开的fifo文件

mode_t mode 打开模式

mode 含义 O_RDONLY 只读 O_WRONLY 只写 O_NONBLOCK 非阻塞

如以只读非阻塞方式打开文件,O_RDONLY|O_NONBLOCK。

在没有设置O_NONBLOCK时,读写都可能出现阻塞:

  • read当文件为空时阻塞都关闭时,才会立刻返回0。

read是阻塞还是非阻塞读取取决于设备的设置,默认情况都是阻塞读取。

  • write当文件为满阻塞

FIFO文件大小一般为4096byte(4kb)在系统头文件limits.hPIPE_BUF宏定义。

输出参数 返回一个实际读取的字节数n(n

关注
打赏
1688896170
查看更多评论

暂无认证

  • 6浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0378s