簡體   English   中英

C中的讀取功能僅讀取3072個字節

[英]read function in c only reading 3072 bytes

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
int main(){
        int fd;
        char bf[4096];
        int buf_size=4096;
        fd = open("/proc/18022/cmdline", O_RDONLY);
        int bytes = read(fd, bf, buf_size-1);
        printf("%d %s\n\n",bytes,bf);
        close(fd);
}

上面的代碼始終只讀取3072個字節,而cmdline字符數大於3072。如果我將cmdline內容復制到gedit,然后在此新創建的文件上運行上面的代碼,則它正在讀取文件的所有字節。 我在Google上搜索了一下,發現它讀取的字節高達SSIZE_MAX但我的疑問是為什么它在第二種情況下讀取所有字節。

即使您知道已為讀取分配了足夠的空間,也不應依賴於第一次嘗試即可讀取整個文件。 相反,您應該逐塊讀取並逐字節處理字節:

char buff[4096];
while((cnt = read(fd, bf, buf_size-1)) > 0) {
    // process the bytes just read, or append them to
    // a larger buffer
}

從手冊頁中引用read()

如果此數目小於請求的字節數,這不是錯誤; 例如,這可能是因為當前實際可用的字節較少(可能是因為我們接近文件末尾,或者因為我們正在從管道或終端讀取),或者因為read()被a中斷了。信號。

對於/proc文件,我們可以在這里看到:

關於此目錄中文件的最獨特之處在於,除了kcore,mtrr和self外,所有文件的大小均為0。

您可能想知道如何查看文件大小為0的進程的詳細信息。如果您將其視為進入內核的窗口,則更有意義。 該文件實際上不包含任何數據。 它只是充當指向實際過程信息所在位置的指針。

這意味着這些偽文件的內容是由內核按內核所需的大小批量發送的。 這看起來非常類似於管道,在管道中,生產者寫入數據,而消費者讀取數據,每個管道以不同的速度運行。

暫無
暫無

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

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