gpt4 book ai didi

c - 为什么非阻塞写入磁盘不返回 EAGAIN 或 EWOULDBLOCK?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:01 24 4
gpt4 key购买 nike

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

我认为由于磁盘 I/O 很慢,当 OS 中的写入缓冲区快满时,写入系统调用将返回 -1,并且 errno 应该是 EAGAIN 或 EWOULDBLOCK。

但是我运行程序大约几分钟,然后重复运行程序几次,write 系统调用一次都没有返回-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 .不过请注意,它相当复杂且不常使用。

关于c - 为什么非阻塞写入磁盘不返回 EAGAIN 或 EWOULDBLOCK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com