linux 管道非阻塞,linux – 管道上的非阻塞读取

可以在管道上进行非阻塞I / O吗? fcntl无法设置O_NONBLOCK. Linux编程接口的页面918包括一个表’从管道读取n个字节或FIFO(p)’的语义.此表列出了管道和FIFO的行为,其中一列标题为O_NONBLOCK已启用?这意味着您可以在管道上设置O_NONBLOCK标志.它是否正确?以下代码无法设置标志,但fcntl(2)不报告错误.

#include

#include

#include

#include

#include

#define SLEEP 1

int

main(int argc, char *argv[]) {

pid_t childPid;

int pfd[2];

int nread, flags;

int c = 'a';

setbuf(stdout, NULL);

if (pipe(pfd) == -1) {

printf("error: pipe");

exit(EXIT_FAILURE);

}

switch (childPid = fork()) {

case -1:

printf("error: fork");

exit(EXIT_FAILURE);

case 0: /* child */

if (close(pfd[0]) == -1) {

printf("child: close pfd read");

exit(EXIT_FAILURE);

}

sleep(SLEEP);

_exit(EXIT_SUCCESS);

default:

break;

/* parent falls through */

}

if (close(pfd[1]) == -1) {

printf("parent: close pipe write");

exit(EXIT_FAILURE);

}

flags = fcntl(pfd[0], F_GETFD);

flags |= O_NONBLOCK;

if (fcntl(pfd[0], F_SETFD, flags))

perror("fcntl");

/* verify flags set correctly */

flags = fcntl(pfd[0], F_GETFD);

if (!(flags & O_NONBLOCK)) {

printf("failed to set O_NONBLOCK\n");

exit(EXIT_FAILURE);

}

wait(NULL);

exit(EXIT_SUCCESS);

}

解决方法:

管道和O_NONBLOCK没有什么特别之处.以下示例按预期工作.我没有检查每次调用的每个retval,以使示例更具可读性.真实世界的应用程序必须进行检查.

#include

#include

#include

#include

int main()

{

int fds[2];

pid_t pid;

char buf[100];

pipe(fds);

pid = fork();

if ( pid )

{

while (1 )

{

memcpy( buf, "abcdefghi\0",10);

write( fds[1], buf, 10);

sleep(2);

}

}

else

{

int retval = fcntl( fds[0], F_SETFL, fcntl(fds[0], F_GETFL) | O_NONBLOCK);

printf("Ret from fcntl: %d\n", retval);

while (1)

{

ssize_t r=read( fds[0], buf, 10 );

printf("read: %d\n", r);

if ( r > 0 )

{

printf("Buffer: %s\n", buf);

}

else

{

printf("Read nothing\n");

perror("Error was");

sleep(1);

}

}

}

}

写完我的例子后,我检查你的代码,发现:

flags = fcntl(pfd[0], F_GETFD);

flags |= O_NONBLOCK;

if (fcntl(pfd[0], F_SETFD, flags))

请将F_SETFD更改为F_SETFL以及get操作.您不会更改文件描述符标志,但文件描述符状态标志:-)

来自man 3 fcntl:

File descriptor flags

The following commands manipulate the flags associated with a file

descriptor. Currently, only one such flag is defined: FD_CLOEXEC, the

close-on-exec flag. If the FD_CLOEXEC bit is 0, the file descriptor

will remain open across an execve(2), otherwise it will be closed.

File status flags

Each open file description has certain associated status flags, ini‐

tialized by open(2) and possibly modified by fcntl(). Duplicated file

descriptors (made with dup(2), fcntl(F_DUPFD), fork(2), etc.) refer to

the same open file description, and thus share the same file status

flags.

F_SETFL (int)

Set the file status flags to the value specified by arg. File

access mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation flags

(i.e., O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are ignored.

On Linux this command can change only the O_APPEND, O_ASYNC,

O_DIRECT, O_NOATIME, and O_NONBLOCK flags. It is not possible

to change the O_DSYNC and O_SYNC flags; see BUGS, below.

标签:linux,pipe,glibc

来源: https://codeday.me/bug/20190727/1555320.html

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

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

相关文章

python异常值删除_python数据清洗中,是如何识别和处理异常值的?

异常值处理是pythonshujuqingxi/ stylecolor:#000;font-size:14px;>python数据清洗中重要的步骤,虽然异常值出现频率比较低,但是如果置之不理的话,还是会对实际项目的分析造成偏差,所以今天小编就跟大家分享pythonshujuqingxi/…

react 子传参父_react子父传参有几种方法?

react子父传参有几种方法?下面本篇文章给大家介绍一下react父子组件传参(值)的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。react父子组件传参(值)的几种方法一、父组件传给子组件父组件通过props传递给子组件&…

啊哈c语言答案1.3,啊哈C语言编程-第2课-让计算机开口说话

为什么会有计算机的出现呢?我们伟大的人类,发明的每一样东西都是为了帮助我们改善生活。计算机同样是用来帮助我们的工具。想一想,假如你现在希望让计算机帮助你做一件事情,你首先需要做什么?是不是要先与计算机进行沟…

python c java_简单明了看懂JAVA,Python和C+的优劣势

Java由于其优越的跨平台可移植性,在Web开发中是主流语言。在加上手机Android系统的发展,使得java开发人员的需求量很大。同时,Java现在也用来开发手游。Java 的语法相对规范。 Python是动态形的灵活的解释性语言,从软件开发到Web开…

c语言源程序文件.c如何保存,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

ultraos win10启动盘_UltraISO制作U盘启动安装MSDN原版Win10系统教程 - SDN系统库

UltraISO制作U盘启动安装Win10系统本教程是介绍使用UltraISO(软碟通)制作U盘启动来安装Win10系统,适用于当原系统损坏、崩溃、升级异常导致系统不能开机时重装,相对比《制作U盘PE启动盘方法》更快,且不需要借助任何第三PE/还原工具&#xff0…

python3.6字典有序_为什么Python 3.6以后字典有序并且效率更高?

在Python 3.5(含)以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插入字典,但是当你打印字典的Keys列表时,你会发现B可能在A的前面。 但是从Python 3.6开始,字典是变成有顺序…

linux 依赖关系解析失败,关于linux依赖关系出错的解决

我在装caffe时遇到的错误如下:apt-get: 代码:sudo apt-get install libgl1-mesa-dev正在读取软件包列表... 完成正在分析软件包的依赖关系树正在读取状态信息... 完成有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是因为系统无法达到您要…

以前是传xml的吗_明明不太合适但是还是被用在配置文件和数据传输上的XML

XML概述:概念:可扩展的标记语言。功能:作为数据本地存储的格式。(已淘汰)作为结构化存储的方式,不如数据库效率高。目前一部分移动设备中还在使用。作为网络中传输数据的格式。(已淘汰)作为网络传输的格式,在目前以移动…

用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花

本文转自:DF创客社区-未经许可不可转载原文链接(附件请于原文下方下载):用新款ws2812灯带做一个简单的窗花-创意生活论坛-DF创客社区​mc.dfrobot.com.cn作者:屌丝王小明很高兴提前拿到了DF即将上架的新品——ws2812灯…

c语言锁屏密码程序,求一个VB锁屏程序的源文件

满意答案nan67182014.07.08采纳率:53% 等级:12已帮助:8369人我原来写的一个缩屏的程序,后来没用,当时只是为了测试透明窗体的.代码给你参考下。功能差一个禁用任务管理器的功能Private Declare Function GetWindowL…

抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?

装配整体式剪力墙结构体系,其主要预制构件包括承重墙(预制剪力墙)、非承重墙(外填充墙、内隔墙等)、预制楼梯(预制楼梯梯段,端部伸出连接钢筋,伸入叠合平台板,通过叠合现浇形成整体楼梯)、预制阳台板(根据建筑要求,整体…

微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机

微软发布电信云平台 ,互联网巨头争夺5G网络商机微软公司周一发布了全新的云平台,能够帮助电信运营商更快地构建5G网络,降低成本并向企业客户出售定制服务。这一5G的新平台将在微软云Azure上运行,微软表示使用该平台将降低基础架构…

用c语言编程参赛信息查询,确定参赛者名单(C语言实现)

/*2011第二届国信蓝点杯全国软件专业人才设计与开发大赛2011第二届国信蓝点杯全国软件专业人才设计与开发大赛选拔赛试题-Java语言高职组最后一题题:A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因&#…

bind merge r 和join_R语言并行读取csv:地表最快csv合并方法

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图…

fanuc机器人编程手册_是谁需要G代码编程机器人?

用G代码编程机器人是一个5,6年前就碰到过的一个概念。当时就有点困惑,不过没有细究为何提出这样的想法。这个问题一直搁置很久也没有想起来主动去了解,去和同行去交流。今天在翻阅西门子自动化产品手册时,看到SINUMERIK产品介绍后…

java各个平台订单动态对接_平台订单丨全国各地最新采购、代加工订单,免费联系对接...

寻求:地铁闸机加工件定制加工需要两种闸机,一种扇门,一种旋转扇门,两必须都按照图纸加工,请仔细审核图纸,欢迎有实力的友商前来洽谈,不符勿扰,谢谢!求购:镀锌…

零基础入门c语言免费教程,C语言零基础急速入门免费教程不定期更新

很多粉丝问我陈老师为什么你会教c语言和java语言?因为名字中”陈“字的汉语拼音中“chen””陈“,和“c”语言是同一个首字母“c”,所以我教“c”语言。又因为同学、学生、粉丝、朋友、同事、亲人们叫我杰哥,汉语拼音中的”jie“&…

python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?

I see the following script snippet from the gensim tutorial page. Whats the syntax of word for word in below Python script? >> texts [[word for word in document.lower().split() if word not in stoplist] >> for document in documents] 解决方案 T…

c语言用队列stl加头文件,C++ STL List队列用法(实例)

#include #include #include #includeusing namespace std;//创建一个list容器的实例LISTINTtypedef listLISTINT;//创建一个list容器的实例LISTCHARtypedef listLISTCHAR;void main(void){//--------------------------//用list容器处理整型数据//--------------------------/…