freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

高級字符驅(qū)動操作說明(存儲版)

2025-05-18 04:29上一頁面

下一頁面
  

【正文】 用時調(diào)用 read , 或者如果當(dāng)緩沖中沒有空間時它調(diào)用 write .如你可能期望的, 非阻塞操作立刻返回, 允許這個應(yīng)用程序輪詢數(shù)據(jù). 應(yīng)用程序當(dāng)使用 stdio 函數(shù)處理非阻塞文件中, 必須小心, 因為它們?nèi)菀赘沐e一個的非阻塞返回為 EOF. 它們始終必須檢查 errno.自然地, O_NONBLOCK 也在 open 方法中有意義. 這個發(fā)生在當(dāng)這個調(diào)用真正阻塞長時間時。 /* begin of buf, end of buf */ int buffersize。 if (down_interruptible(amp。 /* signal: tell the fs layer to handle it */ /* otherwise loop, but first reacquire the lock */ if (down_interruptible(amp。 if (devrp == devend) devrp = devbuffer。 如果我們要持有它而睡眠, 就不會有寫者有機會喚醒我們. 一旦這個確保被丟掉, 我們做一個快速檢查來看是否用戶已請求非阻塞 I/O, 并且如果是這樣就返回. 否則, 是時間調(diào)用 wait_event_interruptible.一旦我們過了這個調(diào)用, 某些東東已經(jīng)喚醒了我們, 但是我們不知道是什么. 一個可能是進程接收到了一個信號. 包含 wait_event_interruptible 調(diào)用的這個 if 語句檢查這種情況. 這個語句保證了正確的和被期望的對信號的反應(yīng), 它可能負責(zé)喚醒這個進程(因為我們處于一個可中斷的睡眠). 如果一個信號已經(jīng)到達并且它沒有被這個進程阻塞, 正確的做法是讓內(nèi)核的上層處理這個事件. 到此, 這個驅(qū)動返回 ERESTARTSYS 到調(diào)用者。 但是象這樣直接改變 current 是不鼓勵的。init_wait(amp。 int result。 if (devwp = devrp) count = min(count, (size_t)(devend devwp))。 /* wrapped */ up(amp。}這個代碼看來和 read 方法類似, 除了我們已經(jīng)將睡眠代碼放到了一個單獨的函數(shù), 稱為 scull_getwritespace. 它的工作是確保在緩沖中有空間給新的數(shù)據(jù), 睡眠直到有空間可用. 一旦空間在, scull_p_write 可簡單地拷貝用戶的數(shù)據(jù)到那里, 調(diào)整指針, 并且喚醒可能已經(jīng)在等待讀取數(shù)據(jù)的進程.處理實際的睡眠的代碼是:/* Wait for space for writing。devoutq, amp。devsem)) return ERESTARTSYS。 if (signal_pending(current)) return ERESTARTSYS。 PDEBUG(\%s\ writing: going to sleep\n,currentm)。 PDEBUG(\%s\ did write %li bytes\n,currentm, (long)count)。 } devwp += count。 /* scull_getwritespace called up(amp。 return ((devrp + devbuffersize devwp) % devbuffersize) 1。 linux/ 包含了所有需要的定義, 以及圍繞例子的內(nèi)核源碼. 但是, 有一個更容易的方式.第一步是創(chuàng)建和初始化一個等待隊列. 這常常由這個宏定義完成:DEFINE_WAIT(my_wait)。 當(dāng)然, 它們對應(yīng) 2 類的睡眠. 其他的狀態(tài)正常地和驅(qū)動編寫者無關(guān).在 內(nèi)核, 對于驅(qū)動代碼通常不需要直接操作進程狀態(tài). 但是, 如果你需要這樣做, 使用的代碼是:void set_current_state(int new_state)。 return count。 return EFAULT。 PDEBUG(\%s\ reading: going to sleep\n, currentm)。 /* Char device structure */}。 類似地, 讀進程被用來喚醒正在等待緩沖空間可用的寫者進程.這個設(shè)備驅(qū)動使用一個設(shè)備結(jié)構(gòu), 它包含 2 個等待隊列和一個緩沖. 緩沖大小是以常用的方法可配置的(在編譯時間, 加載時間, 或者運行時間).struct scull_pipe{ wait_queue_head_t inq, outq。 如果一個進程調(diào)用 write 并且在緩沖中沒有空間, 這個進程必須阻塞, 并且它必須在一個與用作 read 的不同的等待隊列中. 當(dāng)一些數(shù)據(jù)被寫入硬件設(shè)備, 并且在輸出緩沖中的空間變空閑, 這個進程被喚醒并且寫調(diào)用成功, 盡管數(shù)據(jù)可能只被部分寫入如果在緩沖只沒有空間給被請求的 count 字節(jié).這 2 句都假定有輸入和輸出緩沖。 flag = 1。 實際上, 慣例是使用 wake_up 如果你在使用 wait_event , wake_up_interruptible 如果你在使用 wait_event_interruptible.我們現(xiàn)在知道足夠多來看一個簡單的睡眠和喚醒的例子. 在這個例子代碼中, 你可找到一個稱為 sleepy 的模塊. 它實現(xiàn)一個有簡單行為的設(shè)備:任何試圖從這個設(shè)備讀取的進程都被置為睡眠. 無論何時一個進程寫這個設(shè)備, 所有的睡眠進程被喚醒. 這個行為由下面的 read 和 write 方法實現(xiàn):static DECLARE_WAIT_QUEUE_HEAD(wq)。我們將很快返回到等待隊列結(jié)構(gòu), 但是我們知道了足夠多的來首先看看睡眠和喚醒..阻塞 I/O回顧第 3 章, 我們看到如何實現(xiàn) read 和 write 方法. 在此, 但是, 我們跳過了一個重要的問題:一個驅(qū)動當(dāng)它無法立刻滿足請求應(yīng)當(dāng)如何響應(yīng)? 一個對 read 的調(diào)用可能當(dāng)沒有數(shù)據(jù)時到來, 而以后會期待更多的數(shù)據(jù). 或者一個進程可能試圖寫, 但是你的設(shè)備沒有準備好接受數(shù)據(jù), 因為你的輸出緩沖滿了. 調(diào)用進程往往不關(guān)心這種問題。 /* Get by return value */ioctl(fd,SCULL_IOCXQUANTUM, amp。}return retval。 retval = __get_user(scull_quantum, (int __user *)arg)。 scull_quantum = arg。在這個任務(wù)缺乏一個更加特定的能力時, CAP_SYS_ADMIN 被選擇來做這個測試..if (err) return EFAULT。/* * extract the type and number bitfields, and don39。 只對常規(guī)文件發(fā)出的那些.k39。 這個原型由于這些點而凸現(xiàn)于 Unix 系統(tǒng)調(diào)用列表, 這些點常常表示函數(shù)有數(shù)目不定的參數(shù). 在實際系統(tǒng)中, 但是, 一個系統(tǒng)調(diào)用不能真正有變數(shù)目的參數(shù). 系統(tǒng)調(diào)用必須有一個很好定義的原型, 因為用戶程序可存取它們只能通過硬件的門. 因此, 原型中的點不表示一個變數(shù)目的參數(shù), 而是一個單個可選的參數(shù), 傳統(tǒng)上標(biāo)識為 char *argp. 這些點在那里只是為了阻止在編譯時的類型檢查. 第 3 個參數(shù)的實際特點依賴所發(fā)出的特定的控制命令( 第 2 個參數(shù) ). 一些命令不用參數(shù), 一些用一個整數(shù)值, 以及一些使用指向其他數(shù)據(jù)的指針. 使用一個指針是傳遞任意數(shù)據(jù)到 ioctl 調(diào)用的方法?!秶鴮W(xué)智慧、易經(jīng)》46套講座《人力資源學(xué)院》56套講座+27123份資料《各階段員工培訓(xùn)學(xué)院》77套講座+ 324份資料《員工管理企業(yè)學(xué)院》67套講座+ 8720份資料《工廠生產(chǎn)管理學(xué)院》52套講座+ 13920份資料《財務(wù)管理學(xué)院》53套講座+ 17945份資料inode 和 filp 指針是對應(yīng)應(yīng)用程序傳遞的文件描述符 fd 的值, 和傳遞給 open 方法的相同參數(shù). cmd 參數(shù)從用戶那里不改變地傳下來, 并且可選的參數(shù) arg 參數(shù)以一個 unsigned long 的形式傳遞, 不管它是否由用戶給定為一個整數(shù)或一個指針. 如果調(diào)用程序不傳遞第 3 個參數(shù), 被驅(qū)動操作收到的 arg 值是無定義的. 因為類型檢查在這個額外參數(shù)上被關(guān)閉, 編譯器不能警告你如果一個無效的參數(shù)被傳遞給 ioctl, 并且任何關(guān)聯(lián)的錯誤將難以查找.如果你可能想到的, 大部分 ioctl 實現(xiàn)包括一個大的 switch 語句來根據(jù) cmd 參數(shù), 選擇正確的做法. 不同的命令有不同的數(shù)值, 它們常常被給予符號名來簡化編碼. 符號名通過一個預(yù)處理定義來安排. 定制的驅(qū)動常常聲明這樣的符號在它們的頭文件中。/* Please use a different 8bit number in your code */define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)/* * S means Set through a ptr, * T means Tell directly with the argument value * G means Get: reply by setting through a pointer * Q means Query: response is on the return value * X means eXchange: switch G and S atomically * H means sHift: switch T and Q atomically */define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, int)define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)define SCULL_IOCUANTUM _IO(SCULL_IOC_MAGIC, 7)define SCULL_IOCSET _IO(SCULL_IOC_MAGIC, 8)define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC, 11)define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)define SCULL_IOC_MAXNR 14真正的源文件定義幾個額外的這里沒有出現(xiàn)的命令.我們選擇實現(xiàn) 2 種方法傳遞整數(shù)參數(shù): 通過指針和通過明確的值(盡管, 由于一個已存在的慣例, ioclt 應(yīng)當(dāng)通過指針交換值). 類似地, 2 種方法被用來返回一個整數(shù)值:通過指針和通過設(shè)置返回值. 這個有效只要返回值是一個正的整數(shù)。 當(dāng)用作一個設(shè)備文件, 但是, 它返回一個 ENOTTY 錯誤.FIONBIO File IOctl NonBlocking I/O(在阻塞和非阻塞操作一節(jié)中描述). 這個調(diào)用修改在 filpf_flags 中的 O_NONBLOCK 標(biāo)志. 給這個系統(tǒng)調(diào)用的第 3 個參數(shù)用作指示是否這個標(biāo)志被置位或者清除. (我們將在本章看到這個標(biāo)志的角色). 注意常用的改變這個標(biāo)志的方法是使用 ftl 系統(tǒng)調(diào)用, 使用 F_SETFL 命令.列表中的最后一項介紹了一個新的系統(tǒng)調(diào)用, ftl, 它看來象 ioctl. 事實上, ftl 調(diào)用非常類似 ioctl, 它也是獲得一個命令參數(shù)和一個額外的(可選地)參數(shù). 它保持和 ioctl 獨立主要是因為歷史原因: 當(dāng) Unix 開發(fā)者面對控制 I/O 操作的問題時, 他們決定文件和設(shè)備是不同的. 那時, 有 ioctl 實現(xiàn)的唯一設(shè)備是 ttys, 它解釋了為什么 ENOTTY 是標(biāo)準的對不正確 ioctl 命令的回答. 事情已經(jīng)改變, 但是 ftl 保留為一個獨立的系統(tǒng)調(diào)用../* * the direction is a bitmask, and VERIFY_WRITE catches R/W * transfers. `Type39。 返回值指出這個操作是否成功. 再次, __get_user 應(yīng)當(dāng)只用在已經(jīng)使用 access_ok 校驗過的地址.如果做一個嘗試來使用一個列出的函數(shù)來傳送一個不適合特定大小的值, 結(jié)果常常是一個來自編譯器的奇怪消息, 例如cover
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1