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

正文內(nèi)容

操作系統(tǒng)課程設(shè)計(jì)之消息函數(shù)的分析論文-資料下載頁(yè)

2024-08-26 13:51本頁(yè)面

【導(dǎo)讀】Linux是一種自由和開(kāi)放源碼的類Unix操作系統(tǒng)。目前存在著許多不同的Linux,但它們都使用了Linux內(nèi)核。Linux可安裝在各種計(jì)算機(jī)硬件設(shè)備中,從手機(jī)、平板。電腦、路由器和視頻游戲控制臺(tái),到臺(tái)式計(jì)算機(jī)、大型機(jī)和超級(jí)計(jì)算機(jī)。Linux采用消息隊(duì)列的方式來(lái)實(shí)現(xiàn)消息傳遞。事其它工作了——而接收方也不必一直等待消息。消息隊(duì)列允許一個(gè)或多個(gè)進(jìn)程寫消息,一個(gè)或多個(gè)進(jìn)程讀取消息。了一系列消息隊(duì)列的msgque向量表。其中的每一個(gè)單元都指向一個(gè)msqid_ds的數(shù)據(jù)。結(jié)構(gòu),完整描述這個(gè)消息隊(duì)列。當(dāng)創(chuàng)建消息隊(duì)列的時(shí)候,從系統(tǒng)內(nèi)存中分配一個(gè)新的。msqid_ds的數(shù)據(jù)結(jié)構(gòu)并插入到向量表中。后期組織組內(nèi)成員成果匯總進(jìn)行本組總體報(bào)告撰寫。畫出流程圖來(lái)表示相關(guān)函數(shù)之間的相互調(diào)用關(guān)系。sys_msgsnd,寫出代碼分析結(jié)果。閆瞳,張飛龍,負(fù)責(zé)查閱資料。

  

【正文】 tmsg = tmsgmsg_next) // 初值為 tmsg = msqmsg_first, //當(dāng) tmsg 不為 NULL 時(shí)循環(huán),步進(jìn)條件為 tmsg = tmsgmsg_next if (tmsgmsg_type != msgtyp) //當(dāng)遇到消息類型不同于所要 break。 //求類型時(shí)跳出循環(huán) nmsg = tmsg。 //上一段代碼取出隊(duì) //列中第一條消息類型與所給類型不符合的消息。 } else { for (tmsg = msqmsg_first。 tmsg。 tmsg = tmsgmsg_next) if (tmsgmsg_type == msgtyp) //取出該消息這一段代碼的作用 //是取出隊(duì)列中第一條消息類型與所給類型相符 30 的消息。 Break。 nmsg = tmsg。 } } else { //當(dāng) msgtyp 小于 0時(shí) for (leastp = tmsg = msqmsg_first。 tmsg。 //初始設(shè)置 tmsg = tmsgmsg_next) //leastp 為消息隊(duì)列頭 if (tmsgmsg_type leastpmsg_type) //若當(dāng)前消息的類型碼小 //于 leastp 的類型碼 leastp = tmsg。 //將臨時(shí)當(dāng)前消息指針 tmsg 賦值給 leastp if (leastp amp。amp。 leastpmsg_type = msgtyp) //若 leastp 存在且其指向 //消息的類型碼小于給定類型碼的 絕對(duì)值 nmsg = leastp。 //將 leastp 賦值給當(dāng)前指針 nmsg } if (nmsg) { /* done finding a message */ //如果其中存在符合類型的消息 if ((msgsz nmsgmsg_ts) amp。amp。 !(msgflg amp。 MSG_NOERROR)) { return – E2BIG。 //若消息允許大小 (msgsz)小于消 息隊(duì)列中特定消息的大小 //并且沒(méi)有設(shè)置 MSG_NOERROR 則取消息失敗 } msgsz = (msgsz nmsgmsg_ts)? Nmsgmsg_ts : msgsz。 // 在消息允許大小 msgsz 和 消 息 隊(duì) 列 中特 定 消 息 大 小nmsgmsg_ts //取較大的值賦值給 msgsz if (nmsg == msqmsg_first) //若所取消息為消息隊(duì)列頭 msqmsg_first = nmsgmsg_next。 31 //則將 nmsgmsg_next 重新置為消息隊(duì)列頭 else { //若所取消息不是消息隊(duì)列頭 for (tmsg = msqmsg_first。 tmsg。 tmsg = tmsgmsg_next) if (tmsgmsg_next == nmsg) //循環(huán)搜索到要取消息的前一個(gè)指針 tmsg break。 tmsgmsg_next = nmsgmsg_next。 //重新設(shè)置 msg_next 指針域 if (nmsg == msqmsg_last)//若所取消息是消息隊(duì)列尾 msqmsg_last = tmsg。 //重新設(shè)置 msg_last 指針域 } if (!(msqmsg_qnum)) //若取出消息后隊(duì)列中已無(wú)消息 msqmsg_last = msqmsg_first = NULL。 //設(shè)隊(duì)列首與隊(duì)列尾為 NULL msqmsg_rtime = CURRENT_TIME。//取消息時(shí)間更新為 //當(dāng)前時(shí)間 msqmsg_lrpid = currentpid。 //取消息進(jìn)程號(hào)更新為當(dāng)前進(jìn)程號(hào) msgbytes = nmsgmsg_ts。 //全局變量 msgbytes 用來(lái)統(tǒng)計(jì)使用 的消息字節(jié)的大小 //減少相應(yīng)的字節(jié) msghdrs。 //全局變量 msghdrs用來(lái)統(tǒng)計(jì)小心隊(duì)列的個(gè)數(shù),加 1 msqmsg_cbytes = nmsgmsg_ts。 //隊(duì)列中消息字節(jié)數(shù)減少 wake_up (amp。msqwwait)。 //喚醒所有在該消息隊(duì)列上等待的寫消息進(jìn)程 if (put_user (nmsgmsg_type, amp。msgpmtype) || copy_to_user (msgpmtext, nmsgmsg_spot, msgsz)) //將消息賦值到用戶空間 msgsz = EFAULT。 kfree(nmsg)。 //釋放空間 32 return msgsz。 //返回取得消息的大小 } else { /* did not find a message */ //若沒(méi)有找到符合消息類型的 消息 if (msgflg amp。 IPC_NOWAIT) { //若設(shè)置 IPC_NOWAIT return – ENOMSG。 //則返回錯(cuò)誤代碼 } if (signal_pending(current)) {//有信號(hào)要調(diào)用當(dāng)前進(jìn)程 return – EINTR。 } interruptible_sleep_on (amp。msqrwait)。//讓該進(jìn)程在讀進(jìn)程上阻塞 } } /* end while */ return 1。 //返回 1表示接收失敗 } 33 函數(shù) sys_msgctl 的分析 代碼及注釋 asmlinkage int sys_msgctl (int msqid, int cmd, struct msqid_ds *buf) //msqid 參數(shù)指定了一個(gè)消息隊(duì)列, cmd指出 sys_msgctl 函數(shù)應(yīng)該對(duì)它如何操作。 //需不需要 buf 取決于 cmd,而且即使當(dāng)它被使用時(shí)它的含義也將隨情況的不同而不同 。 34 { int id, err = EINVAL。 struct msqid_ds *msq。 struct msqid_ds tbuf。 struct ipc_perm *ipcp。 lock_kernel()。//do { } while(0) //加鎖 if (msqid 0 || cmd 0) //檢查參數(shù) ,如果參數(shù)錯(cuò)誤就進(jìn)行出錯(cuò)處理 goto out。 err = EFAULT。 //根據(jù) cmd的不同進(jìn)行不同的處理 switch (cmd) { case IPC_INFO: case MSG_INFO: //返回所需要的信息到指定的結(jié)構(gòu) struct msginfo 中 if (!buf) goto out。//返回 { struct msginfo msginfo。 /* buffer for msgctl calls IPC_INFO, MSG_INFO */ = MSGMNI。 = MSGMAX。 = MSGMNB。 = MSGMAP。 = MSGPOOL。 = MSGTQL。 = MSGSSZ。 = MSGSEG。 if (cmd == MSG_INFO) { //假如 cmd 是 MSG_INFO 而不是 IPC_INFO 時(shí),還要包括一些額外信息 = used_queues。 = msghdrs。 = msgbytes。 35 } err = EFAULT。 if (copy_to_user (buf, amp。msginfo, sizeof(struct msginfo))) goto out。 //復(fù)制是由 copy_to_user 函數(shù) err = max_msqid。 goto out。 } case MSG_STAT: //返回所需要的統(tǒng)計(jì)信息 — 它的當(dāng)前和最大容量、它的最近的讀者和寫者的 PID,等等。 If (!buf) goto out。 err = EINVAL。 if (msqid max_msqid) goto out。 msq = msgque[msqid]。 if (msq == IPC_UNUSED || msq == IPC_NOID) goto out。 err = EACCES。 if (ipcperms (amp。msqmsg_perm, S_IRUGO)) //缺少訪問(wèn)該隊(duì)列的許可,則返回 goto out。 id = (unsigned int) msq * MSGMNI + msqid。 //計(jì)算 ” 完全的 ” 標(biāo)識(shí)符 — 序列編號(hào) = msqmsg_perm。 = msqmsg_stime。 = msqmsg_rtime。 = msqmsg_ctime。 = msqmsg_cbytes。 = msqmsg_qnum。 = msqmsg_qbytes。 = msqmsg_lspid。 = msqmsg_lrpid。 36 //把請(qǐng)求的信息復(fù)制到一個(gè)臨時(shí)變量中 err = EFAULT。 if (copy_to_user (buf, amp。tbuf, sizeof(*buf))) //再把臨時(shí)變量復(fù)制回調(diào)用者的緩存 goto out。 err = id。 //返回 ” 完全的 ” 標(biāo)識(shí)符 — 序列編號(hào) goto out。 //剩下三種情況: IPC_SET、 IPC_STAT,和 IPC_RMID,與上述情況都在 switch 語(yǔ)句里被完全的處理不同,在此僅進(jìn)行部分處理 case IPC_SET: //緩沖區(qū)非空,就將它復(fù)制到 tbuf 里以便后面函數(shù)的進(jìn)一步處理 if (!buf) goto out。 err = EFAULT。 //err 被再次賦值 if (!copy_from_user (amp。tbuf, buf, sizeof (*buf))) err = 0。 break。 case IPC_STAT: //只檢查緩沖區(qū)是否非空 if (!buf) goto ou
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1