- 主题:nonblocking open有没有啥思路?
一般的nonblocking都是先获得fd,然后对这个fd做nonblocking的read/write。
但是对于regular file来说,fd = open(path...)本身也是要读磁盘的,"open"自己就不是nonblocking。
有没有其他的系统调用可以取代open来做nonblocking?
从man page里看open + O_NONBLOCK是不行的。
感觉思路应该是类似socket,先用api1 "socket"得到fd,然后设置成nonblocking,再用api2 "connect"。
2步走的方法做到了nonblocking,但是打开普通文件好像只有"open",没有别的系统调用了。
--
FROM 27.26.0.*
io_uring有一个操作是IOURING_OP_OPENAT
【 在 deadlylight 的大作中提到: 】
: 一般的nonblocking都是先获得fd,然后对这个fd做nonblocking的read/write。
: 但是对于regular file来说,fd = open(path...)本身也是要读磁盘的,"open"自己就不是nonblocking。
: 有没有其他的系统调用可以取代open来做nonblocking?
: ....................
- 来自「最水木 for iPhone12,8」
--
FROM 75.31.75.*
这个看起来是可以的,不过要很新的kernel才支持,目前还用不上。
【 在 lambdai 的大作中提到: 】
: io_uring有一个操作是IOURING_OP_OPENAT
: - 来自「最水木 for iPhone12,8」
--
FROM 27.26.4.*
好奇问一下为什么之后读写不怕阻塞,反而担心open?
【 在 deadlylight 的大作中提到: 】
: 这个看起来是可以的,不过要很新的kernel才支持,目前还用不上。
:
: 【 在 lambdai 的大作中提到: 】
: ....................
- 来自「最水木 for iPhone12,8」
--
FROM 107.77.211.*
因为楼主说了。read/write 都有非阻塞接口可用。而 open() 没有。
这确实是个大问题。因为在云服务器上面,有非常大的可能性文件系统可能是通过 nfs 挂接的。
【 在 lambdai (lambdai) 的大作中提到: 】
: 好奇问一下为什么之后读写不怕阻塞,反而担心open?
: - 来自「最水木 for iPhone12,8」
--
FROM 110.81.14.*
好吧我突然脑子抽筋了。
那read/write前怎么大概知道会有数据呢?
【 在 hgoldfish 的大作中提到: 】
: 因为楼主说了。read/write 都有非阻塞接口可用。而 open() 没有。
:
: 这确实是个大问题。因为在云服务器上面,有非常大的可能性文件系统可能是通过 nfs 挂接的。
: ....................
- 来自「最水木 for iPhone12,8」
--
FROM 107.77.211.*
select/poll/epoll到一堆fd上去,如果全都阻塞,那就阻塞,
如果有fd进入读或写不阻塞的状态,就会返回
【 在 lambdai (lambdai) 的大作中提到: 】
: 好吧我突然脑子抽筋了。
: 那read/write前怎么大概知道会有数据呢?
: - 来自「最水木 for iPhone12,8」
: ...................
--
FROM 122.225.220.*
这几个核心都是file ops的poll吧。不是说普通磁盘上文件的实现总是会返回可写可读吗?
如果lz是说的bsd socket file,能很好地支持epoll,那就不会用open创建fd了吧
【 在 adoal 的大作中提到: 】
: select/poll/epoll到一堆fd上去,如果全都阻塞,那就阻塞,
: 如果有fd进入读或写不阻塞的状态,就会返回
:
: ....................
- 来自「最水木 for iPhone12,8」
--
FROM 107.77.211.*
open/read/write都需要nonblocking。
不是不怕,而是read/write已经有方法了,只有open没有方法。
【 在 lambdai 的大作中提到: 】
: 好奇问一下为什么之后读写不怕阻塞,反而担心open?
: :
: - 来自「最水木 for iPhone12,8」
--
FROM 137.69.117.*
select/poll/epoll确实主要是给socket用的。
regular file io可以用aio_read系列,或者io_submit系列,但是都没解决open的问题。
【 在 lambdai 的大作中提到: 】
: 这几个核心都是file ops的poll吧。不是说普通磁盘上文件的实现总是会返回可写可读吗?
: 如果lz是说的bsd socket file,能很好地支持epoll,那就不会用open创建fd了吧
: :
: ...................
--
FROM 137.69.117.*