为什么非阻塞写入磁盘不会 return EAGAIN 或 EWOULDBLOCK?

why non-blocking write to disk doesn't return EAGAIN or EWOULDBLOCK?

我从APUE修改了一个程序,程序先打开一个文件,然后将fd标记为非阻塞,然后继续写入fd,直到写入return -1。

我认为由于磁盘I/O很慢,当OS中的写入缓冲区快满时,写入系统调用将return -1,错误号应该是EAGAIN或EWOULDBLOCK.

但是我运行这个程序大约几分钟,我重复运行这个程序好几次了,write系统调用连一次都没有returned -1!为什么? 这是代码:

#include "apue.h"
#include <errno.h>
#include <fcntl.h>

char    buf[4096];

int
main(void)
{
        int nwrite;

        int fd = open("a.txt", O_RDWR);
        if(fd<0){
            printf("fd<0\n");
            return 0;
        }
        int  i;
        for(i = 0; i<sizeof(buf); i++)
            buf[i] = i*2;

        set_fl(fd, O_NONBLOCK); /* set nonblocking */

        while (1) {
                nwrite = write(fd, buf, sizeof(buf));
                if (nwrite < 0) {
                    printf("write returned:%d, errno=%d\n", nwrite, errno);
                    return 0;
                }
        }

        clr_fl(STDOUT_FILENO, O_NONBLOCK);      /* clear nonblocking */

        exit(0);
}

O_NONBLOCK 标志主要对表示流(例如,管道、套接字和字符设备)的文件描述符有意义,它可以防止读写操作在没有数据等待读取时阻塞,或缓冲区太满,此时无法再写入任何内容。它对打开常规文件的文件描述符没有影响;磁盘 I/O 延迟基本上被系统忽略。

如果你想对文件进行异步 I/O,你可能想看看 the POSIX AIO interface。不过请注意,它相当复杂且不常使用。