簡體   English   中英

將文件描述符讀入 NULL 是否合法?

[英]Is it legal to read a file descriptor into NULL?

最近,為了我正在編寫的庫,我一直在修復時間步長 經過一些研究,假設我最終得到了這個原型,它精確且易於與我的庫的通用事件系統結合:

#include <stdio.h>
#include <unistd.h>
#include <sys/timerfd.h>
#include <poll.h>

struct pollfd fds[1];
struct itimerspec its;

int main(void) {
    fds[0] = (struct pollfd) {timerfd_create(CLOCK_MONOTONIC, 0), POLLIN, 0}; //long live clarity
    its.it_interval = (struct timespec) {0, 16666667};
    its.it_value = (struct timespec) {0, 16666667};
    timerfd_settime(fds[0].fd, 0, &its, NULL);
    while(1) {
        poll(fds, 1, -1);
        if(fds[0].revents == POLLIN) {
            long long buffer;
            read(fds[0].fd, &buffer, 8);
            printf("ROFL\n");
        } else {
            printf("BOOM\n");
            break;
        }
    }
    close(fds[0].fd);
    return 0;
}

但是,為了使計時器的文件描述符可重用,我不得不用寶貴的 8 字節數據污染我的 CPU 緩存,這嚴重傷害了我。 因此,我嘗試用lseek()替換read()調用,如下所示:

lseek(fds[0].fd, 0, SEEK_END);

不幸的是,這甚至lseek(fds[0].fd, 8, SEEK_CUR); 給了我ESPIPE錯誤並且無法正常工作。 但是后來,我發現盡管給出了EFAULT s,但以下內容實際上完成了它的工作:

read(fds[0].fd, NULL, 8);

像這樣偏移文件描述符是否合法,已定義的行為? 如果不是(正如EFAULT向我建議的那樣,強烈到足以避免使用那個天才),是否存在一個 function 會丟棄讀取的數據,而不會將其寫下來,或者以其他方式抵消我的計時器的文件描述符?

read(2)的 POSIX 規范沒有指定將 null 指針作為緩沖區參數傳遞的結果。 沒有給出具體的錯誤代碼,也沒有說明是否會從描述符中讀取任何數據。

Linux 手冊頁有這個錯誤,但是:

EFAULT buf在您可訪問的地址空間之外。

但是,它並沒有說它會在發生這種情況時讀取 8 個字節並丟棄它們。

所以我認為你不能像你想要的那樣依賴這個工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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