![](/img/trans.png)
[英]Can write() to a non-blocking fd return EAGAIN when select reports it as writable?
[英]why non-blocking write to disk doesn't return EAGAIN or EWOULDBLOCK?
我從APUE修改了一個程序,該程序首先打開一個文件,然后將fd標記為非阻塞,然后繼續寫入fd直到寫入返回-1。
我認為由於磁盤I / O速度很慢,因此當OS中的寫緩沖區快滿時,寫系統調用將返回-1,並且errno應該為EAGAIN或EWOULDBLOCK。
但是我將程序運行了大約幾分鍾,然后重復運行服務器幾次,即使一次寫入系統調用也沒有返回-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
標志主要用於表示流的文件描述符(例如,管道,套接字和字符設備),在沒有數據等待讀取或緩沖區太滿而無法寫入其他內容時, O_NONBLOCK
標志可防止讀寫操作阻塞在這一刻。 它對打開到常規文件的文件描述符沒有影響; 磁盤I / O延遲基本上被系統忽略。
如果要對文件執行異步I / O,則可能需要看一下POSIX AIO接口 。 請注意,它相當多毛且不經常使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.