O_NONBLOCK模式下写fifo的注意事项

后台网络通信框架一般采用fifo来作为事件通知的机制:创建一个fifo,然后以非阻塞读和非阻塞写的方式打开fifo,然后把fd加到epoll里面,作为通知网络事件的fd.

在这里有个隐晦的问题容易被忽视.fifo在以非阻塞模式打开时,必须先打开读,然后打开写.不然会报错No such device or address.即如下代码所示是正确的

#define FIFO_FILE "/tmp/fifo.xxx"
#define FIFO_MODE FILE_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH

mkfifo(FIFO_FILE, FIFO_MODE);
int readfd  = open(FIFO_FILE, O_RDONLY | O_NONBLOCK, 0);
int writefd = open(FIFO_FILE, O_WRONLY | O_NONBLOCK, 0);

上述代码中的两个open不能反过来,不然会报错: No such device or address

注意到这种情况,那即使以后我们写代码是在两个进程间通过fifo来通信,也不用关心以写的方式打开fifo之前,fifo是否已经以读的方式打开,因为我们可以设置一个dummy fd,如下所示:

int dummyfd = open(FIFO_FILE, O_RDONLY | O_NONBLOCK, 0);
int writefd = open(FIFO_FILE, O_WRONLY | O_NONBLOCK, 0);

敢兴趣的朋友可以把下面的代码复制过去,看看输出结果:

1/注释L18

2/不注释L18

 1 #include <unistd.h>
 2 #include <sys/types.h>
 3 #include <sys/stat.h>
 4 #include <fcntl.h>
 5
 6 #include <errno.h>
 7 #include <stdio.h>
 8 #include <string.h>
 9
10 #define FILE_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
11 #define FIFO_FILE "/tmp/fifo.test_nonblock_write"
12
13 int main(void)
14 {
15     mkfifo(FIFO_FILE, FILE_MODE);
16     fprintf(stderr, "mkfifo, errno=%d, error=%s\n", errno, strerror(errno));
17
18     //open(FIFO_FILE, O_RDONLY|O_NONBLOCK, 0);
19     fprintf(stderr, "open(O_RDONLY), errno=%d, error=%s\n", errno, strerror(errno));
20
21     open(FIFO_FILE, O_WRONLY|O_NONBLOCK, 0);
22     fprintf(stderr, "open(O_WRONLY), errno=%d, error=%s\n", errno, strerror(errno));
23
24     unlink(FIFO_FILE);
25
26     return 0;
27 }
时间: 2024-10-15 11:18:51

O_NONBLOCK模式下写fifo的注意事项的相关文章

USB小白学习之路(9) CY7C68013A Slave FIFO模式下与FPGA通信

CY7C68013A Slave FIFO模式下与FPGA通信 CY7C68013A的时钟是由FPGA提供的24MHz,RESET引脚也是由FPGA控制. 1.开始时没有给FPGA烧录程序,将CY7C68013A接到PC上,安装驱动后,是检测不到device的,经查找,原因有两个: ①没有时钟,这种情况下需要先让FPGA跑起来,为CY7C68013A提供时钟 ②复位引脚没有控制,因为CY7C68013A的复位时低有效,如果FPGA的引脚不控制,就会使得此引脚电平不固定,CY7C68013A处于复

Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就standalone部署方式下的容错性问题做比较细致的分析,主要回答standalone部署方式下的包含哪些主要节点,当某一类节点出现问题时,系统是如何处理的. Standalone部署的节点组成 介绍Spark的资料中对于RDD这个概念涉及的比较多,但对于RDD如何运行起来,如何对应到进程和线程的,着墨的不是很多. 在实际的生产环境中,Spark总是会以集群的方式进行运行的,其中standalone的部署方式是所有集群方式中最为精简的一种,另外

WIN7-X64内核模式下编程实现导出表列表查看

内核模式下查看导出表需要注意的事项比在用户模式下要考虑更加周详: X64环境倒不是变化太多,指针定是64位的,数据数据及指针指向的数据类型需要注意: 不费话,直接上源码,VS2010+WDK7600下编译通过: /// /// @file aux_list.c /// @author cntom90151 /// @date2015-09-24 /// #include <ntddk.h> #include <WinDef.h> #include <aux_klib.h>

[PHP] swoole在daemonize模式下,chdir失效问题

swoole version: 1.9.6 其实跟swoole的版本无关,因为原代码体系,fpm模式下,在启动的时候,是使用 chdir 函数改变了当前目录的,而其它代码在做类的自动加载的时候,都是写的相对地址,而不是绝对地址. 问题就来了,swoole是多进程的,在daemonize模式下,chdir改变当前目录,在其它进程下是不生效的,所以有时候,不使用daemonize没问题,而使用daemonize会莫名的出现找不到类的情况. 解决方法是,在几个启动的回调里面同时也改变一下目录 $ser

Play生产模式下java.io.FileNotFoundException那点事

之前”用Scala+Play构建地理数据查询接口”那篇文章里,用到的数据是json格式的文本文件area.json,存放在conf/jsons文件夹下.最开始是放在public/文件夹下,在线上准生产模式下运行: activator dist 得到mosquito-1.0.zip压缩包,解压后: 去/bin目录下运行mosquito脚本报错: java.io.FileNotFoundException 然后就去解压的mosquito-1.0/看发现并没有public文件夹,由此可见public文

DEBUG模式下, 内存中的变量地址分析

测试函数的模板实现 [cpp] view plain copy /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #define MY_TEMPLATE_H_2016_0123_1226 template<int iArySize> void fnTestDataType() { char szBuf[iArySize] = {'\0'}; unsigned short wT

tableView编辑模式下删除多个cell

在编辑模式下,tableView有自带的删除多个cell的方法. 这种效果自定义写也可以,但是我这里用的是系统的. 先上效果图.核心代码: _tableView.allowsMultipleSelectionDuringEditing = YES; 至于全选删除和选择一部分删除就不上具体代码了. 如果想要点击cell后的颜色,代码如下: //选中cell的背景色 UIImageView *imageView = [[UIImageView alloc]init]; imageView.backg

5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制、剪切和粘贴

5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制.剪切和粘贴 5.1 vim介绍 vim 是 vi的一个升级版本 vim 是带有颜色显示的 再试下vim 命令 [[email protected] ~]# vi /etc/passwd[[email protected] ~]# vim /etc/passwd-bash: vim: 未找到命令 [[email protected] ~]# yum install -y vim-e

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行