linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?
嘗試
read(2)(在unistd.h中),它應該輸出5個字符.當使用libc(
fread(3),fwrite(3)等)時,你正在使用內部libc緩沖區,它通常是一個頁面的大小(幾乎總是4 kiB).
我相信第一次調用fread()5個字節時,libc會執行4096字節的內部read(),而后面的fread()將只返回與您使用的FILE結構相關聯的緩沖區中已有的libc字節.直到達到4096.第4097個字節將發出另一個4096字節的讀取,依此類推.
當你編寫時也會發生這種情況,例如當使用printf()時,它只是帶有stdout()的fprintf()作為它的第一個參數. libc不會直接調用write(2),而是將你的東西放入其內部緩沖區(也是4096字節).如果你打電話,它會沖洗
fflush(stdout);
你自己,或者在發送的字節中找到字節0x0a(ASCII中的換行符)的任何時候.
嘗試一下,你會看到:
#include /* for printf() */
#include /* for sleep() */
int main(void) {
printf("the following message won't show up\n");
printf("hello,world!");
sleep(3);
printf("\nuntil now...\n");
return 0;
}
然而,這將工作(不使用libc的緩沖):
#include /* for printf() */
#include /* for sleep(),write(),and STDOUT_FILENO */
int main(void) {
printf("the following message WILL show up\n");
write(STDOUT_FILENO,"hello!",6);
sleep(3);
printf("see?\n");
return 0;
}
STDOUT_FILENO是標準輸出(1)的默認文件描述符.
每次有新行時刷新對于終端用戶立即查看消息至關重要,并且對于每行處理也很有幫助,這在Unix環境中已經完成了很多工作.
因此,即使libc直接使用read()和write()系統調用來填充和刷新其緩沖區(并且通過C標準庫的Microsoft實現必須使用Windows的東西,可能是ReadFile和WriteFile),那些系統調用絕對可以不知道libc.當使用兩者時,這會導致有趣的行為:
#include /* for printf() */
#include /* for write() and STDOUT_FILENO */
int main(void) {
printf("1. first message (flushed now)\n");
printf("2. second message (without flushing)");
write(STDOUT_FILENO,"3. third message (flushed now)",30);
printf("\n");
return 0;
}
哪個輸出:
1. first message (flushed now)
3. third message (flushed now)2. second message (without flushing)
(第二個之前的第三個!).
另請注意,您可以使用setvbuf(3)關閉libc的緩沖.示例:
#include /* for setvbuf() and printf() */
#include /* for sleep() */
int main(void) {
setvbuf(stdout,NULL,_IONBF,0);
printf("the following message WILL show up\n");
printf("hello!");
sleep(3);
printf("see?\n");
return 0;
}
我從來沒有嘗試過,但我猜你可以用FILE *來做同樣的事情,當fopen()你的角色設備并禁用I / O緩沖時:
FILE* fh = fopen("/dev/my-char-device","rb");
setvbuf(fh,0);
總結
以上是生活随笔為你收集整理的linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑升级新玩法:a88x内存超频攻略大揭
- 下一篇: 显卡性能提升秘籍,内存频率1700MHz