linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?
嘗試
read(2)(在unistd.h中),它應(yīng)該輸出5個字符.當使用libc(
fread(3),fwrite(3)等)時,你正在使用內(nèi)部libc緩沖區(qū),它通常是一個頁面的大小(幾乎總是4 kiB).
我相信第一次調(diào)用fread()5個字節(jié)時,libc會執(zhí)行4096字節(jié)的內(nèi)部read(),而后面的fread()將只返回與您使用的FILE結(jié)構(gòu)相關(guān)聯(lián)的緩沖區(qū)中已有的libc字節(jié).直到達到4096.第4097個字節(jié)將發(fā)出另一個4096字節(jié)的讀取,依此類推.
當你編寫時也會發(fā)生這種情況,例如當使用printf()時,它只是帶有stdout()的fprintf()作為它的第一個參數(shù). libc不會直接調(diào)用write(2),而是將你的東西放入其內(nèi)部緩沖區(qū)(也是4096字節(jié)).如果你打電話,它會沖洗
fflush(stdout);
你自己,或者在發(fā)送的字節(jié)中找到字節(jié)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)的默認文件描述符.
每次有新行時刷新對于終端用戶立即查看消息至關(guān)重要,并且對于每行處理也很有幫助,這在Unix環(huán)境中已經(jīng)完成了很多工作.
因此,即使libc直接使用read()和write()系統(tǒng)調(diào)用來填充和刷新其緩沖區(qū)(并且通過C標準庫的Microsoft實現(xiàn)必須使用Windows的東西,可能是ReadFile和WriteFile),那些系統(tǒng)調(diào)用絕對可以不知道libc.當使用兩者時,這會導(dǎo)致有趣的行為:
#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)關(guān)閉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()你的角色設(shè)備并禁用I / O緩沖時:
FILE* fh = fopen("/dev/my-char-device","rb");
setvbuf(fh,0);
總結(jié)
以上是生活随笔為你收集整理的linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑升级新玩法:a88x内存超频攻略大揭
- 下一篇: 显卡性能提升秘籍,内存频率1700MHz