日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?

發(fā)布時間:2024/2/28 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

嘗試

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。