linux使用怎样write截断文件,linux – 什么时候write()到文件返回EWOULDBLOCK?

我想经常将数据附加到本地文件系统上的文件中.我想这样做而不会阻塞太长时间,并且不需要任何工作线程.在Linux内核2.6.18上.

似乎Linux上的glibc的POSIX AIO实现使用户空间线程池并阻止这些线程.这很酷,但我可以很容易地剥离我自己的特殊专用文件阻塞线程.

而且我的理解是Linux Kernel AIO实现目前阻止追加.追加是我唯一想做的事情.

我正在考虑用O_NONBLOCK打开文件,然后做一种懒惰的写入,如果它是EWOULDBLOCK,那么稍后再尝试写入.像这样的东西:

> open(pathname,O_CREAT | O_APPEND | O_NONBLOCK);

>调用write(),检查错误EAGAIN | EWOULDBLOCK

>如果是EAGAIN | EWOULDBLOCK,然后只保存要写入的数据并稍后再次尝试write().

这是一个好主意吗?这有什么实际优势吗?如果我是唯一一个对该文件具有开放文件描述符的人,并且我尝试使用write()和EWOULDBLOCK,那么以后是否更不可能使用EWOULDBLOCK?它会永远EWOULDBLOCK吗?如果我写()并且它没有EWOULDBLOCK,那是否意味着write()将迅速返回?

换句话说,在Linux 2.6.18上使用EWOULDBLOCK,在什么情况下(如果有的话)将write()写入本地文件失败?

解决方法:

under … what circumstances … will write() to a local file fail with EWOULDBLOCK

也许没有文件的情况. Linux man page for write(2)声明仅为引用套接字的文件描述符返回EWOULDBLOCK.

EAGAIN or EWOULDBLOCK

The file descriptor fd refers to a socket and has been marked nonblocking (O_NONBLOCK), and the write would block. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities.

显然,这种行为与套接字使用记录锁的事实有关,而简单文件则不然.

标签:linux,asynchronous,io,linux-kernel,filesystems

来源: https://codeday.me/bug/20190901/1782360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值