我想经常将数据附加到本地文件系统上的文件中.我想这样做而不会阻塞太长时间,并且不需要任何工作线程.在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