linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响

FIFO文

#include

#include

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

参数:

pathname:FIFO的路径名+文件名。

mode:mode_t类型的权限描述符,同open的参数。

返回值:

成功:返回0

失败:如果文件已经存在,则会出错且返回-1。

操作FIFO文件时的特点:

系统调用的I/O函数都可以作用于FIFO,如open、close、read、write等。

打开FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:

特点一:不指定O_NONBLOCK(即open没有位或O_NONBLOCK)

1、open以只读方式打开FIFO时,要阻塞到某个进程为写而打开此FIFO

2、open以只写方式打开FIFO时,要阻塞到某个进程为读而打开此FIFO。

3、open以只读、只写方式打开FIFO时会阻塞,调用read函数从FIFO里读数据时read也会阻塞。

4、调用write函数向FIFO里写数据,当缓冲区已满时write也会阻塞。

5、通信过程中若写进程先退出了,则调用read函数从FIFO里读数据时不阻塞;若写进程又重新运行,则调用read函数从FIFO里读数据时又恢复阻塞。

6、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到SIGPIPE信号)退出。

特点二:指定O_NONBLOCK(即open位或O_NONBLOCK)

1、先以只读方式打开:如果没有进程已经为写而打开一个FIFO, 只读open成功,并且open不阻塞。

2、先以只写方式打开:如果没有进程已经为读而打开一个FIFO,只写open将出错返回-1。

3、read、write读写命名管道中读数据时不阻塞。

4、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到SIGPIPE信号)退出。

注意:

open函数以可读可写方式打开FIFO文件时的特点:open不阻塞,可以这样理解:因为其本身以可读可写的方式打开,所以不需要别的进程帮其打开。

注:关于非阻塞方式或非阻塞打开FIFO,read时返回值的问题:

若某个FIFO的最后一个写进程终止了或关闭了该FIFO,那么将为FIFO的读进程产生一个文件结束标志。如果 read()读数据时第一个读到的是文件结束标志,那么就返回0。

1、阻塞方式:

1) 写进程未退出,read阻塞,等待写端的输入

2) 写进程终止了或关闭了该FIFO,read非阻塞,为FIFO的读进程产生一个文件结束标志,read的返回值为0。

2、非阻塞方式:

假设一个进程以非阻塞读方式打开一个FIFO.该FIFO之前已经被以写方式被其他进程打开,但无数据被写入,那么此时读进程需要立刻返回,那么应该返回什么呢?

我们知道 如果 read()读数据时第一个读到的是文件结束标志,那么就返回0。如果像 我们想的那样 没有数据读应该返回0 ,那么这个0就具有二义性。因为我们不知道是没有数据造成的返回0还是写端关闭造成的返回0.

所以POSIX.1要求,对一个非阻塞的描述符如果无数据可读,则read返回-1,而且 errno被设置为 EAGAIN。

1) 如果在随后调用read函数之前,如果另一个进程已经以写方式打开了该FIFO,并写入了数据,那么正常读取数据。

2) 如果在随后调用read函数之前,如果另一个进程已经以写方式打开了该FIFO,但是并未写入数据,read调用会立刻出错返回-1, 并设置 errnno为EAGAIN。

3)如果在随后调用read函数之前,没有其他进程以写方式打开该FIFO,或是曾经有但是在read读时已经关闭了,那么read返回0,表示读到文件结束标志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet的学习之Request请求对象(2)

在上一篇《Servlet的学习(十)》中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能。 使用HttpServletRequest可以防止盗链行为,什么是盗链行为,比如说在一个别的网站上超链接&#xf…

如何提高linux的时钟精度,Linux时钟精度提高有什么办法?

2 动态高精度时钟设计和实现动态高精度时钟设计方案借鉴了KURT-Linux思想,但与其不同的是提供一个与标准Linux核心时钟并行的具有精密刻度的实时时钟,并与原核心时钟区别开。采用X86体系CPU提供的TSC作为高精度的时间标度,权衡一定时间段(如一…

c语言循环程序怎么编程,c语言程序(5):循环结构程序设计

#include #include #include /*循环结构:1.基本循环语句while循环do_while循环for循环1.1 所有的的循环&#xff0c;都是满足条件循环1.2 while循环while(条件){循环体;}1.3 kbhit() :监测键盘是否按键&#xff0c;1.4do{循环体;}while(count<3);1.5 for循环for(表达式1;表达…

Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例

1. 通过多线程改进刚才的聊天程序&#xff0c;这样我就可以实现在一个窗口发送和接收数据了 2. 代码示例&#xff1a; &#xff08;1&#xff09;SendThread.java&#xff0c;如下&#xff1a; 1 package com.himi.udpDemo2;2 3 import java.io.BufferedReader;4 import java.…

c语言宿舍管理设计报告,C语言课程设计—学生宿舍管理系统设计报告.doc

word格式精心整理版范文范例 学习指导课 程 设 计 报 告课程名称 C语言程序设计课题名称 学生宿舍管理系统专 业班 级学 号姓 名指导教师2012年6月19日湖南工程学院课 程 设 计 任 务 书课程名称 C语言程序设计课 题 学生宿舍管理系统专业班级学生姓名学 号指导老师审 批任务书…

EF编辑

//修改推荐的信息 var productRe db.Shop_ProductRecommends.Single(item > item.Id model.Id); productRe.seat model.seat; db.Set<Shop_ProductRecommends>().Attach(productRe); db.Entry(productRe).State EntityState.Modified;转载于:https://www.cnblogs.…

考勤管理系统c语言,C语言课程设计学生考勤系统最终版(范文1)

《C语言课程设计学生考勤系统.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《C语言课程设计学生考勤系统(最终版)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、&#xff1b;return(head)&#xff1b;}voidenter()*录入函数*{structS…

关于类和接口的一些小笔记

如果一个类实现了多个接口&#xff0c;如果将这个类实例化&#xff0c;那么这些接口之间可以互相调用的。转载于:https://www.cnblogs.com/pilihaotian/p/4868609.html

汇编语言调用c语言ads,ADS1.2 在汇编代码中调用C函数

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x, U) b) } U8 \" d/ v( \$ ~ T对于ARM体系来说&#xff0c;不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard)&#xff0c;…

c语言选择法排序案例,谁能给我一个c语言选择排序法的简单例子

满意答案evil83752014.02.27采纳率&#xff1a;51% 等级&#xff1a;11已帮助&#xff1a;7590人#include int main(){int array[100], n, c, d, position, swap;printf("Enter number of elements\n");scanf("%d", &n);printf("Enter %d inte…

huffman算法c语言实验报告,huffman二叉树实验报告--数据结构(c语言).doc

江海强 PAGE 7数 据 结 构 作 业 报 告——Huffman二叉树实验报告姓名&#xff1a;江海强班级&#xff1a;070921班学号上机时间&#xff1a;2010-报告时间&#xff1a;2010-10-26摘要1.实验目的本实验是为了让我们深入了解Huffman二叉树&#xff0c;学会使用Huffman编码…

《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息

这一次&#xff0c;琢磨了一下Unity3D网络游戏发展的网络信息处理。服务器的网络游戏一般都是自主研发&#xff0c;因此&#xff0c;相应的网络消息处理应该培养自己。client/现在使用的邮件服务器之间的价差JSON和Google.ProtocolBuffers有两种常见的方法。平炉码看其处理。代…

tarjan算法c语言,tarjan算法板子 - osc_e45irv7l的个人空间 - OSCHINA - 中文开源技术交流社区...

无向图概念时间戳\(dfn[x]\),在深度优先遍历中&#xff0c;按照每个节点第一次被访问的顺序&#xff0c;依次做整数标记追溯值\(low[x]\),通过非搜索边能到达的最小时间戳割边判定法则无向边\((x,y)\)是割边/桥&#xff0c;当且仅当存在x的一个子节点满足\(dfn[x] < low[y]\…

流和文件

流&#xff1a;流是数据的传输方式&#xff1b;C程序处理一个流而不是直接处理文件。你声明一个FILE *fp &#xff0c;并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头&#xff0c;当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头&…

小球进盒子C语言,N个小球放进M个盒子算法-Go语言中文社区

N个小球放入M个盒子共有多少种方法&#xff0c;并输出的算法设计&#xff1a;算法思路1 &#xff1a;暴力填充盒子每个小球都可能放入M个盒子的任意一个&#xff0c;所以直接根据小球个数做递归即可,然后将存储放入hash中排重//TODO算法思路2 &#xff1a;递归填充盒子即&#…

r语言c5.0要求因子输出,R语言中因子的创建与使用

原标题&#xff1a;R语言中因子的创建与使用因子在R语言中可以用来表示名义型变量或有序变量。名义变量一般表示类别&#xff0c;如性别&#xff0c;种族等等。有序变量是有一定排序顺序的变量&#xff0c;如职称&#xff0c;年级等等。在R语言中&#xff0c;名义变量和有序变量…

WinForm中使用AnyCAD三维控件 の 初始化

在WinForm中可以方便的集成AnyCAD.Net三维控件&#xff0c;只需要以下几部即可完成。 一、添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation.Net.dll AnyCAD.Exchange.Net.dll 二、初始化控件 1.首先创建一个窗体 2.在窗体上放置一个Panel用来放置三维控件 3.初始…

linux中nodejs后台运行工具forever

forever让nodejs应用后台执行 命令如下&#xff1a; forever start ./bin/www nodejs一般是当成一条用户命令执行的&#xff0c;当用户断开客户连接&#xff0c;运用也就停了&#xff0c;很烦人。如何让nodejs应用当成服务&#xff0c;在后台执行呢&#xff1f; 最简单的办法(不…

android启动其他app的服务器,Android中通过外部程序启动App的三种方法

这篇文章主要介绍了Android中通过外部程序启动App的三种方法,本文讲解了直接通过包名、通过自定义的Action、通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下第一种&#xff1a;直接通过包名&#xff1a;复制代码 代码如下:Intent LaunchIntent getPackageManage…

linux date 天之前,linux date命令前后几天的推导

linux date使用(前后几天时间推导)在Linux系统 中&#xff0c;可以采用如下方法&#xff1a;1) 取之前的时间&#xff1a;date -d "a day ago" %Y%m%d 取出前1天的系统时间date -d "2 days ago" %Y%m%d 取出前2天的系统时间2) 取之后的时间&#xff1a;dat…