可以在管道上进行非阻塞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

linux 管道非阻塞,linux – 管道上的非阻塞读取相关推荐

  1. linux 管道非阻塞,在Linux中管道上的非阻塞读取

    可以在管道上进行非阻塞I / O吗? fcntl无法设置O_NONBLOCK. Linux编程接口的页面918包括一个表'从管道读取n个字节或FIFO(p)'的语义.此表列出了管道和FIFO的行为,其 ...

  2. linux pipe 阻塞,Linux pipe():從管道中讀取數據並不總是能夠解阻塞寫入器

    I have a problem using pipe under Linux. I would like to fill a pipe to make further write's call bl ...

  3. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    From: http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112163171778/ 五种I/O 模式: [1]        ...

  4. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  5. Linux 下的进程间通信:管道、消息队列、共享文件、共享内存

    Table of Contents 无名管道 命名管道 消息队列 共享文件 示例 1. 生产者程序 示例 2. 消费者程序 共享内存 示例 3. memwriter 进程的源程序 示例 4. memr ...

  6. Linux管道的原子性,管道的原子性 linux写操作原子性

    从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的 ...

  7. linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  8. 【Linux】进程间通信1-匿名管道1

    文章目录 管道符[|] 创建匿名管道的pipe函数 从内核角度深入理解管道 代码验证pipe函数 管道和子进程的先后创建顺序 代码实现父子进程的通信 管道的特性 前言 为什么需要进程间通信呢? 每一个 ...

  9. linux pipe函数 重定向,I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)...

    1.I/O重定向的概念与原因 及 标准输入.输出的标准错误的定义 所以的Unix I/O重定向都基于标准数据流的原理.三个数据了分别如下: 1)标准输入--需要处理的数据流 2)标准输出--结果数据流 ...

最新文章

  1. thinkphp读写mysql的枷锁_thinkphp5 数据库配置读写分离
  2. unicode 编码转换漏洞_好程序员Python教程之字符串编码知识小结
  3. 这五种 Python 字符串连接方式,你都知道吗?
  4. 2015年必火的五个Html5移动开发工具推荐
  5. python指针引用的区别_C++基础:指针和引用的区别
  6. html 表格文字颜色 css,CSS 表格-JavaScript中文网-JavaScript教程资源分享门户
  7. 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
  8. pickle.dump()把大量数据写入文件发生MemoryError解决方法
  9. 北京国际大数据交易所成立,采用区块链技术分离数据所有权
  10. app推广广告词热点
  11. centos6.5 安装php-5.6.31
  12. [zoj]3575 Under Attack III
  13. 最新!Oracle/ MySQL/ MSSQL 三大数据库集体跳水。。
  14. 计算机中文无敌版,与电脑下象棋无敌版
  15. 商场客流量统计摄像头设备
  16. Python爬虫之字体解密 | 以滑雪为例演示大众点评商铺信息采集
  17. hadoop3新特性
  18. oracle常用函数汇总(1)
  19. win7与internet时间同步出错_Windows7旗舰版系统同步internet时间总是提示同步时出错怎么办...
  20. 铁矿石再度领跌商品,LPG认沽上涨3倍,MTO季节性上涨2022.6.22

热门文章

  1. 【剑指 offer】面试题13:机器人的运动范围(Java)
  2. MySQL小问题:导入employee测试数据
  3. html5的新标记,HTML5 新标记
  4. c语言设计一维数组,一维数组 (1)C语言程序设计.pdf
  5. 华为手机怎么使用读卡器_华为手机使用小窍门
  6. pytorch报错RuntimeError: error in LoadLibraryA
  7. windows网络版象棋的实现
  8. CompletableFuture详解~异常处理
  9. Struts2自定义标签(template)——示例
  10. linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口