#include #define fifo_size (1024)
typedef struct tags_fifo
s_fifo;
int fifo_min(unsigned int ulfirstdat, unsigned int ulsndvalue)
else
}int fifo_init(s_fifo *pfifo)
pfifo->ulsize = fifo_size;
pfifo->ulin = 0;
pfifo->ulout = 0;
pfifo->pbuf = malloc(fifo_size * sizeof(char));
if (null == pfifo->pbuf)
return 0;
}int fifo_putdata(s_fifo *pfifo, char *psrc, unsigned int ullen)
/* 首先算出當前剩餘空間,然後決定當前能寫入的最大長度,其餘長度丟棄 */
ullen = fifo_min(ullen, pfifo->ulsize - pfifo->ulin + pfifo->ulout);
/* 算出沒有溢位時,能最大寫入的長度,注意沒有溢位時,可能需要兩次寫入 */
ulwrlen = fifo_min(ullen, pfifo->ulsize - (pfifo->ulin & (pfifo->ulsize -1)));
memcpy(pfifo->pbuf + (pfifo->ulin & (pfifo->ulsize -1)), psrc, ulwrlen);
memcpy(pfifo->pbuf, psrc + ulwrlen, ullen - ulwrlen);
pfifo->ulin += ullen;
return ullen;
}
int fifo_getdata(s_fifo *pfifo, char *pdst, unsigned int ullen)
/* 首先算出當前資料空間,然後決定當前能讀取的最大長度,其餘長度丟棄 */
ullen = fifo_min(ullen, fifo->ulin - fifo->ulout);
/* 算出沒有溢位時,能最大讀取的長度,注意溢位時,可能需要兩次讀取 */
ulrdlen = fifo_min(ullen, pfifo->ulsize - (pfifo->ulout & (pfifo->ulsize -1)));
memcpy(pdst, fifo->pbuf + (pfifo-ulout & (pfifo->ulsize - 1)), ulrdlen);
memcpy(pdst + ulrdlen, pfifo->pbuf, ullen - ulrdlen);
pfifo->ulout += ullen;
return ullen;
}
使用者程序緩衝區和核心緩衝區
常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
核心緩衝區slab的管理
剛看了下linux核心情景分析中的核心緩衝區管理,現在做個小總結,有不當之處,請大家不吝賜教。在linux核心中,對於大塊的記憶體的管理是用夥伴系統演算法 buddy 管理。對於小塊的記憶體則用slab管理。在slab方法中,每種重要的資料結構都有自己專用的緩衝區佇列。每個佇列中的 物件 的個數是動...