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