为什么非阻塞写入磁盘不会 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。不过请注意,它相当复杂且不常使用。
我从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。不过请注意,它相当复杂且不常使用。