簡體   English   中英

為什么非阻塞寫入磁盤不返回EAGAIN或EWOULDBLOCK?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM