主頁(yè) > 知識(shí)庫(kù) > linux驅(qū)動(dòng)開(kāi)發(fā)中常用函數(shù)copy_from_user open read write詳解

linux驅(qū)動(dòng)開(kāi)發(fā)中常用函數(shù)copy_from_user open read write詳解

熱門(mén)標(biāo)簽:做外呼系統(tǒng)的公司違法嗎 400電話申請(qǐng)方案 在百度地圖標(biāo)注車(chē)輛 烏海智能電話機(jī)器人 撫順移動(dòng)400電話申請(qǐng) 威海人工外呼系統(tǒng)供應(yīng)商 寧夏房產(chǎn)智能外呼系統(tǒng)要多少錢(qián) 貴陽(yáng)教育行業(yè)電話外呼系統(tǒng) 藍(lán)點(diǎn)外呼系統(tǒng)

linux驅(qū)動(dòng)常用函數(shù)(copy_from_user open read write)

1.open

函數(shù)定義:
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
參數(shù)說(shuō)明:
  pathname :文件的名稱,可以包含(絕對(duì)和相對(duì))路徑
  flags:文件打開(kāi)模式
  mode: 用來(lái)規(guī)定對(duì)該文件的所有者,文件的用戶組及系統(tǒng)中其他用戶的訪問(wèn)權(quán)限,則文件權(quán)限為:mode&(~umask)
函數(shù)說(shuō)明:
參數(shù)pathname 指向欲打開(kāi)的文件路徑字符串。下列是參數(shù)flags 所能使用的旗標(biāo):

  • O_RDONLY 以只讀方式打開(kāi)文件;
  • O_WRONLY 以只寫(xiě)方式打開(kāi)文件;
  • O_RDWR 以可讀寫(xiě)方式打開(kāi)文件;

上述三種旗標(biāo)是互斥的,也就是不可同時(shí)使用,但可與下列的旗標(biāo)利用OR(|)運(yùn)算符組合;

  • O_CREAT 若欲打開(kāi)的文件不存在則自動(dòng)建立該文件;
  • O_EXCL 如果O_CREAT也被設(shè)置,此指令會(huì)去檢查文件是否存在。文件若不存在則建立該文件,否則將導(dǎo)致打開(kāi)文件錯(cuò)誤,此外,若O_CREAT與O_EXCL同時(shí)設(shè)置,并且欲打開(kāi)的文件為符號(hào)連接,則會(huì)打開(kāi)文件失敗。
  • O_NOCTTY 如果欲打開(kāi)的文件為終端機(jī)設(shè)備時(shí),則不會(huì)將該終端機(jī)當(dāng)成進(jìn)程控制終端機(jī);
  • O_TRUNC 若文件存在并且以可寫(xiě)的方式打開(kāi)時(shí),此旗標(biāo)會(huì)令文件長(zhǎng)度清為0,而原來(lái)存于該文件的資料也會(huì)消失;
  • O_APPEND 當(dāng)讀寫(xiě)文件時(shí)會(huì)從文件尾開(kāi)始移動(dòng),也就是所寫(xiě)入的數(shù)據(jù)會(huì)以附加的方式加入到文件后面;
  • O_NONBLOCK 以不可阻斷的方式打開(kāi)文件,也就是無(wú)論有無(wú)數(shù)據(jù)讀取或等待,都會(huì)立即返回進(jìn)程之中;
  • O_NDELAY 同O_NONBLOCK;
  • O_SYNC 以同步的方式打開(kāi)文件;
  • O_NOFOLLOW 如果參數(shù)pathname 所指的文件為一符號(hào)連接,則會(huì)令打開(kāi)文件失敗;
  • O_DIRECTORY 如果參數(shù)pathname 所指的文件并非為一目錄,則會(huì)令打開(kāi)文件失敗。

此為L(zhǎng)inux2.2以后特有的旗標(biāo),以避免一些系統(tǒng)安全問(wèn)題。參數(shù)mode 則有下列數(shù)種組合,只有在建立新文件時(shí)才會(huì)生效,此外真正建文件時(shí)的權(quán)限會(huì)受到umask值所影響,因此該文件權(quán)限應(yīng)該為(mode-umaks)。

  • S_IRWXU00700 權(quán)限,代表該文件所有者具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限;
  • S_IRUSR 或S_IREAD,00400權(quán)限,代表該文件所有者具有可讀取的權(quán)限;
  • **S_IWUSR 或S_IWRITE,00200 **權(quán)限,代表該文件所有者具有可寫(xiě)入的權(quán)限;
  • S_IXUSR 或S_IEXEC,00100 權(quán)限,代表該文件所有者具有可執(zhí)行的權(quán)限;
  • S_IRWXG 00070權(quán)限,代表該文件用戶組具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限;
  • S_IRGRP 00040 權(quán)限,代表該文件用戶組具有可讀的權(quán)限;
  • S_IWGRP 00020權(quán)限,代表該文件用戶組具有可寫(xiě)入的權(quán)限;
  • S_IXGRP 00010 權(quán)限,代表該文件用戶組具有可執(zhí)行的權(quán)限;
  • S_IRWXO 00007權(quán)限,代表其他用戶具有可讀、可寫(xiě)及可執(zhí)行的權(quán)限;
  • S_IROTH 00004 權(quán)限,代表其他用戶具有可讀的權(quán)限;
  • S_IWOTH 00002權(quán)限,代表其他用戶具有可寫(xiě)入的權(quán)限;
  • S_IXOTH 00001 權(quán)限,代表其他用戶具有可執(zhí)行的權(quán)限。

返回值:
若所有欲核查的權(quán)限都通過(guò)了檢查則返回0值,表示成功,只要有一個(gè)權(quán)限被禁止則返回-1。

錯(cuò)誤代碼:
EEXIST 參數(shù)pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標(biāo);
EACCESS 參數(shù)pathname所指的文件不符合所要求測(cè)試的權(quán)限;
EROFS 欲測(cè)試寫(xiě)入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi);
EFAULT 參數(shù)pathname指針超出可存取內(nèi)存空間;
EINVAL 參數(shù)mode 不正確;
ENAMETOOLONG 參數(shù)pathname太長(zhǎng);
ENOTDIR 參數(shù)pathname不是目;
ENOMEM 核心內(nèi)存不足;
ELOOP 參數(shù)pathname有過(guò)多符號(hào)連接問(wèn)題;
EIO I/O 存取錯(cuò)誤。

#include
#include
#include
#include
main()
{
    int fd,size;
    char s [ ]=”Linux Programmer!\n”,buffer[80];
    fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);
    write(fd,s,sizeof(s));
    close(fd);
    fd=open(“/tmp/temp”,O_RDONLY);
    size=read(fd,buffer,sizeof(buffer));
    close(fd);
    printf(“%s”,buffer);
}

2.read

函數(shù)定義:
ssize_t read(int fd, void * buf, size_t count);

函數(shù)說(shuō)明:
read()會(huì)把參數(shù)fd所指的文件傳送count 個(gè)字節(jié)到buf 指針?biāo)傅膬?nèi)存中。

返回值:
返回值為實(shí)際讀取到的字節(jié)數(shù), 如果返回0, 表示已到達(dá)文件尾或是無(wú)可讀取的數(shù)據(jù)。若參數(shù)count 為0, 則read()不會(huì)有作用并返回0。

注意:
  read時(shí)fd中的數(shù)據(jù)如果小于要讀取的數(shù)據(jù),就會(huì)引起阻塞。
  read的用法比write較為簡(jiǎn)單,此處不敘述過(guò)多。由于筆者水平也有限,如果文中有謬誤之處還懇請(qǐng)諸位指出,以免誤導(dǎo)大家。

3.write

函數(shù)定義:
ssize_t write (int fd, const void * buf, size_t count);

函數(shù)說(shuō)明:
write()會(huì)把參數(shù)buf所指的內(nèi)存寫(xiě)入count個(gè)字節(jié)到參數(shù)放到所指的文件內(nèi)。

返回值:
如果順利write()會(huì)返回實(shí)際寫(xiě)入的字節(jié)數(shù)。當(dāng)有錯(cuò)誤發(fā)生時(shí)則返回-1,錯(cuò)誤代碼存入errno中。
(1)write()函數(shù)返回值一般無(wú)0,只有當(dāng)如下情況發(fā)生時(shí)才會(huì)返回0:write(fp, p1+len, (strlen(p1)-len)中第三參數(shù)為0,此時(shí)write()什么也不做,只返回0。man手冊(cè)給出的write()返回值的說(shuō)明如下:
(2)write()函數(shù)從buf寫(xiě)數(shù)據(jù)到fd中時(shí),若buf中數(shù)據(jù)無(wú)法一次性讀完,那么第二次讀buf中數(shù)據(jù)時(shí),其讀位置指針(也就是第二個(gè)參數(shù)buf)不會(huì)自動(dòng)移動(dòng),需要程序員編程控制
而不是簡(jiǎn)單的將buf首地址填入第二參數(shù)即可。如可按如下格式實(shí)現(xiàn)讀位置移動(dòng):write(fp, p1+len, (strlen(p1)-len)。 這樣write第二次循環(huán)時(shí)變會(huì)從p1+len處寫(xiě)數(shù)據(jù)到fp, 之后的也
由此類推,直至(strlen(p1)-len變?yōu)?。

以下通過(guò)一個(gè)例子具體說(shuō)明write函數(shù)用法:

#include 
#include 
#include 
int main()
{
  char *p1 = "This is a c test code";
  volatile int len = 0;
 
  int fp = open("/home/test.txt", O_RDWR|O_CREAT);
  for(;;)
  {
     int n;
 
     if((n=write(fp, p1+len, (strlen(p1)-len)))== 0)   //if((n=write(fp, p1+len, 3)) == 0) 
     {                                                 //strlen(p1) = 21
         printf("n = %d \n", n);
         break;
     }
     len+=n;
  }
  return 0;
}

(3)在write一次可以寫(xiě)的最大數(shù)據(jù)范圍內(nèi)(貌似是BUFSIZ ,8192),第三參數(shù)count大小最好為buf中數(shù)據(jù)的大小,以免出現(xiàn)錯(cuò)誤。(經(jīng)過(guò)筆者再次試驗(yàn),write一次能夠?qū)懭氲牟⒉恢挥?192這么多,筆者嘗試一次寫(xiě)入81920000,結(jié)果也是可以,看來(lái)其一次最大寫(xiě)入數(shù)據(jù)并不是8192,但內(nèi)核中確實(shí)有BUFSIZ這個(gè)參數(shù),具體指什么還有待研究)

4.copy_to_user

函數(shù)定義:
unsigned long copy_to_user(void *to, const void *from, unsigned long n)
參數(shù)說(shuō)明:
to:目標(biāo)地址(用戶空間)
from:源地址(內(nèi)核空間)
n:將要拷貝數(shù)據(jù)的字節(jié)數(shù)
函數(shù)說(shuō)明:
從內(nèi)核空間中讀取數(shù)據(jù)到用戶空間
返回值:
成功返回0,失敗返回沒(méi)有拷貝成功的數(shù)據(jù)字節(jié)數(shù)

5.copy_from_user

函數(shù)定義:
unsigned long copy_from_user(void *to, const void *from, unsigned long n);
參數(shù)說(shuō)明:
to:目標(biāo)地址(內(nèi)核空間)
from:源地址(用戶空間)
n:將要拷貝數(shù)據(jù)的字節(jié)數(shù)
函數(shù)說(shuō)明:
從用戶空間中讀取數(shù)據(jù)到內(nèi)核空間
返回值:
成功返回0,失敗返回沒(méi)有拷貝成功的數(shù)據(jù)字節(jié)數(shù)

以上就是linux驅(qū)動(dòng)常用函數(shù)(copy_from_user open read write)的詳細(xì)內(nèi)容,更多關(guān)于linux驅(qū)動(dòng)常用函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!,希望大家以后多多支持腳本之家!

標(biāo)簽:慶陽(yáng) 銅川 松原 泰州 蕪湖 周口 朝陽(yáng) 那曲

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux驅(qū)動(dòng)開(kāi)發(fā)中常用函數(shù)copy_from_user open read write詳解》,本文關(guān)鍵詞  linux,驅(qū)動(dòng),開(kāi)發(fā),中,常用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux驅(qū)動(dòng)開(kāi)發(fā)中常用函數(shù)copy_from_user open read write詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于linux驅(qū)動(dòng)開(kāi)發(fā)中常用函數(shù)copy_from_user open read write詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章