3.基本C庫函數
當編寫(xiě)驅動(dòng)程序時(shí),一般情況下不能使用C標準庫的函數。Linux內核也提供了與標準庫函數功能相同的一些函數,但二者還是稍有差別。
| 類(lèi)別 | 函數名 | 功能 | 函數形成 | 參數 | 描述 |
| 字符串轉換 | simple_strtol | 把一個(gè)字符串轉換為一個(gè)有符號長(cháng)整數 | long simple_strtol (const char * cp, char ** endp, unsigned int base) | cp指向字符串的開(kāi)始,endp為指向要分析的字符串末尾處的位置,base為要用的基數。 | |
| simple_strtoll | 把一個(gè)字符串轉換為一個(gè)有符號長(cháng)長(cháng)整數 | long long simple_strtoll (const char * cp, char ** endp, unsigned int base) | cp指向字符串的開(kāi)始,endp為指向要分析的字符串末尾處的位置,base為要用的基數。 | | |
| simple_strtoul | 把一個(gè)字符串轉換為一個(gè)無(wú)符號長(cháng)整數 | long long simple_strtoul (const char * cp, char ** endp, unsigned int base) | cp指向字符串的開(kāi)始,endp為指向要分析的字符串末尾處的位置,base為要用的基數。 | | |
| simple_strtoull | 把一個(gè)字符串轉換為一個(gè)無(wú)符號長(cháng)長(cháng)整數 | long long simple_strtoull (const char * cp, char ** endp, unsigned int base) | cp指向字符串的開(kāi)始,endp為指向要分析的字符串末尾處的位置,base為要用的基數。 | | |
| vsnprintf | 格式化一個(gè)字符串,并把它放在緩存中。 | int vsnprintf (char * buf, size_t size, const char * fmt, va_list args) | buf為存放結果的緩沖區, size為緩沖區的大小,fmt為要使用的格式化字符串,args為格式化字符串的參數。 | | |
| snprintf | 格式化一個(gè)字符串,并把它放在緩存中。 | int snprintf (char * buf, size_t size, const char * fmt, ... ...) | buf為存放結果的緩沖區, size為緩沖區的大小,fmt為格式化字符串,使用@…來(lái)對格式化字符串進(jìn)行格式化,…為可變參數。 | | |
| vsprintf | 格式化一個(gè)字符串,并把它放在緩存中。 | int vsprintf (char * buf, const char * fmt, va_list args) | buf為存放結果的緩沖區, size為緩沖區的大小,fmt為要使用的格式化字符串,args為格式化字符串的參數。 | | |
| sprintf | 格式化一個(gè)字符串,并把它放在緩存中。 | int sprintf (char * buf, const char * fmt, ... ...) | buf為存放結果的緩沖區, size為緩沖區的大小,fmt為格式化字符串,使用@…來(lái)對格式化字符串進(jìn)行格式化,…為可變參數。 | | |
| 字符串操作 | strcpy | 拷貝一個(gè)以NUL結束的字符串 | char * strcpy (char * dest, const char * src) | dest為目的字符串的位置, src為源字符串的位置。 | |
| strncpy | 拷貝一個(gè)定長(cháng)的、以NUL結束的字符串 | char * strncpy (char * dest, const char * src, size_t count) | dest為目的字符串的位置, src為源字符串的位置,count為要拷貝的最大字節數 | 與用戶(hù)空間的strncpy不同,這個(gè)函數并不用NUL填充緩沖區,如果與源串超過(guò)count,則結果以非NUL結束 | |
| strcat | 把一個(gè)以NUL結束的字符串添加到另一個(gè)串的末尾 | char * strcat (char * dest, const char * src) | dest為要添加的字符串, src為源字符串。 | | |
| strncat | 把一個(gè)定長(cháng)的、以NUL結束的字符串添加到另一個(gè)串的末尾 | char * strncat (char * dest, const char * src, size_t count) | dest為要添加的字符串, src為源字符串,count為要拷貝的最大字節數 | 注意,與strncpy,形成對照, strncat正常結束。 | |
| strchr | 在一個(gè)字符串中查找第一次出現的某個(gè)字符 | char * strchr (const char * s, int c) | s為被搜索的字符串,c為待搜索的字符。 | | |
| strrchr | 在一個(gè)字符串中查找最后一次出現的某個(gè)字符 | char * strrchr (const char * s, int c) | s為被搜索的字符串,c為待搜索的字符。 | | |
| strlen | 給出一個(gè)字符串的長(cháng)度 | size_t strlen (const char * s) | s為給定的字符串 | | |
| strnlen | 給出給定長(cháng)度字符串的長(cháng)度 | size_t strnlen (const char * s, size_t count) | s為給定的字符串 | | |
| strpbrk | 在一個(gè)字符串中查找第一次出現的一組字符 | char * strpbrk (const char * cs, const char * ct) | cs為被搜索的字符串,ct為待搜索的一組字符 | | |
| strtok | 把一個(gè)字符串分割為子串 | char * strtok (char * s, const char * ct) | s為被搜索的字符串,ct為待搜索的子串 | 注意,一般不提倡用這個(gè)函數,而應當用strsep | |
| memset | 用給定的值填充內存區 | void * memset (void * s, int c, size_t count) | s為指向內存區起始的指針,c為 要填充的內容,count為內存區的大小 | I/O空間的訪(fǎng)問(wèn)不能使用memset,而應當使用memset_io。 | |
| bcopy | 把內存的一個(gè)區域拷貝到另一個(gè)區域 | char * bcopy (const char * src, char * dest, int count) | src為源字符串,dest為目的字符串,而count為內存區的大小 | 注意,這個(gè)函數的功能與memcpy相同,這是從BSD遺留下來(lái)的,對I/O空間的訪(fǎng)問(wèn)應當用memcpy_toio或 memcpy_fromio | |
| memcpy | 把內存的一個(gè)區域拷貝到另一個(gè)區域 | void * memcpy (void * dest, const void * src, size_t count) | dest為目的字符串,Src為源字符串,而count為內存區的大小 | 對I/O空間的訪(fǎng)問(wèn)應當用memcpy_toio或 memcpy_fromio | |
| memmove | 把內存的一個(gè)區域拷貝到另一個(gè)區域 | void * memmove (void * dest, const void * src, size_t count) | dest為目的字符串,Src為源字符串,而count為內存區的大小 | memcpy和memmove處理重疊的區域,而該函數不處理。 | |
| memcmp | 比較內存的兩個(gè)區域 | int memcmp (const void * cs, const void * ct, size_t count) | cs為一個(gè)內存區,ct為另一個(gè)內存區,而count為內存區的大小 | | |
| memscan | 在一個(gè)內存區中查找一個(gè)字符 | void * memscan (void * addr, int c, size_t size) | addr為內存區,c為要搜索的字符,而size為內存區的大小 | 返回c第一次出現的地址,如果沒(méi)有找到c,則向該內存區傳遞一個(gè)字節。 | |
| strstr | 在以NUL結束的串中查找第一個(gè)出現的子串 | char * strstr (const char * s1, const char * s2) | s1為被搜索的串,s2為待搜索的串。 | | |
| memchr | 在一個(gè)內存區中查找一個(gè)字符 | void * memchr (const void * s, int c, size_t n) | s為內存區,為待搜索的字符,n為內存的大小 | 返回c第一次出現的位置,如果沒(méi)有找到c,則返回空。 | |
| 位操作 | set_bit | 在位圖中原子地設置某一位 | void set_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址 | 這個(gè)函數是原子操作,如果不需要原子操作,則調用__set_bit函數,nr可以任意大,位圖的大小不限于一個(gè)字。 |
| __set_bit | 在位圖中設置某一位 | void __set_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址 | | |
| clear_bit | 在位圖中清某一位 | void clear_bit (int nr, volatile void * addr) | nr為要清的位,addr為位圖的起始地址 | 該函數是原子操作,但不具有加鎖功能,如果要用于加鎖目的,應當調用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函數,以確保任何改變在其他的處理器上是可見(jiàn)的。 | |
| __change_bit | 在位圖中改變某一位 | void __change_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址。 | 與change_bit不同,該函數是非原子操作。 | |
| change_bit | 在位圖中改變某一位 | void change_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址。 | | |
| test_and_set_bit | 設置某一位并返回該位原來(lái)的值 | int test_and_set_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址。 | 該函數是原子操作 | |
| __test_and_set_bit | 設置某一位并返回該位原來(lái)的值 | int __test_and_set_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址。 | 該函數是非原子操作,如果這個(gè)操作的兩個(gè)實(shí)例發(fā)生競爭,則一個(gè)成功而另一個(gè)失敗,因此應當用一個(gè)鎖來(lái)保護對某一位的多個(gè)訪(fǎng)問(wèn)。 | |
| test_and_clear_bit | 清某一位,并返回原來(lái)的值 | int test_and_clear_bit (int nr, volatile void * addr); | nr為要設置的位,addr為位圖的起始地址。 | 該函數是原子操作 | |
| __test_and_clear_bit | 清某一位,并返回原來(lái)的值 | int __test_and_clear_bit (int nr, volatile void * addr); | nr為要設置的位,addr為位圖的起始地址。 | 該函數為非原子操作 | |
| test_and_change_bit | 改變某一位并返回該位的新值 | int test_and_change_bit (int nr, volatile void * addr) | nr為要設置的位,addr為位圖的起始地址。 | 該函數為原子操作 | |
| test_bit | 確定某位是否被設置 | int test_bit (int nr, const volatile void * addr) | nr為要測試的第幾位,addr為位圖的起始地址。 | | |
| find_first_zero_bit | 在內存區中查找第一個(gè)值為0的位 | int find_first_zero_bit (void * addr, unsigned size) | addr為內存區的起始地址,size為要查找的最大長(cháng)度 | 返回第一個(gè)位為0的位號 | |
| find_next_zero_bit | 在內存區中查找第一個(gè)值為0的位 | int find_next_zero_bit (void * addr, int size, int offset) | addr為內存區的起始地址,size為要查找的最大長(cháng)度,offset開(kāi)始搜索的起始位號。 | | |
| ffz | 在字中查找第一個(gè)0 | unsigned long ffz (unsigned long word); | word為要搜索的字。 | | |
| ffs | 查找第一個(gè)已設置的位 | int ffs (int x) | x為要搜索的字。 | 這個(gè)函數的定義方式與Libc中的一樣。 | |
| hweight32 | 返回一個(gè)N位字的加權平衡值 | hweight32 ( x) | x為要加權的字 | 一個(gè)數的加權平衡是這個(gè)數所有位的總和。 |
聯(lián)系客服