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

正文內(nèi)容

操作系統(tǒng)課程設(shè)計(jì)之消息函數(shù)的分析論文(完整版)

  

【正文】 DATALEN_SEG) alen = DATALEN_SEG。 if (copy_from_user(msg+1, src, alen)) { err = EFAULT。 struct msg_msgseg** pseg。 return msg_buildid(id,msq)。 msqq_lspid = msqq_lrpid = 0。 return ENOSPC。 12 endif } static int newque (key_t key, int msgflg)/*新建消息隊(duì)列 */ { int id。msg_ids,amp。 /* 消息發(fā)送者的隊(duì)列 */ }。 /* 最后修改時(shí)間 */ unsigned long q_cbytes。 /*用于存放消息的鏈表 */ long m_type。 /* 最大大小 */ 10 struct msg_msg* volatile r_msg。 static int used_queues = 0。IPC_NOWAIT)是真的 ,調(diào)用進(jìn)程會(huì)立即返回 ,若沒(méi)有接收到消息則返回值為 1,error 設(shè)置為 ENOMSG. 若 (msgflgamp。 mtype 是一個(gè)整數(shù) ,用于接收進(jìn)程選擇消息類型 . mtext 是一個(gè)長(zhǎng)度為 msgsz 字節(jié)的任何正文 ,參數(shù) msgsz 可從 0 到 系 統(tǒng)允許的最 大 值 之 間變化 . msgflg 指定操作行為 : 若 (msgflgamp。調(diào)用者提供消息隊(duì)列的鍵標(biāo)(用于表示一個(gè)消息列的唯一的名字),當(dāng)這個(gè)隊(duì)列存在的時(shí)候,這個(gè)系統(tǒng)調(diào)用負(fù)責(zé)返回這個(gè)隊(duì)列的標(biāo)識(shí)號(hào);如果這個(gè)隊(duì)列不存在,就創(chuàng)立一個(gè)消息隊(duì)列,然后返回這個(gè)消息隊(duì)列的標(biāo)識(shí)號(hào)。這時(shí),進(jìn)程會(huì)被放到消息隊(duì)列的寫(xiě)等待隊(duì)列,然后調(diào)用調(diào)度程序選擇一個(gè)新的進(jìn)程運(yùn)行。當(dāng)創(chuàng)建消息隊(duì)列的時(shí)候,從系統(tǒng)內(nèi)存中分配一個(gè)新的msqid_ds 的數(shù)據(jù)結(jié)構(gòu)并插入到向量表中 。鞠冰霜,畫(huà)出流程圖來(lái)表示相關(guān)函數(shù)之間的相互調(diào)用關(guān)系。魏蕾,負(fù)責(zé)查閱資料。 新的消息總是放在隊(duì)列的末尾,接收的時(shí)候并不總是從頭來(lái)接收,可以從中間來(lái)接收。 Linux 可安裝在各種計(jì)算機(jī)硬件設(shè)備中,從手機(jī)、平板電腦、路由器和視頻游戲控制臺(tái),到臺(tái)式計(jì)算機(jī)、大型機(jī)和超級(jí)計(jì)算機(jī)。 關(guān)鍵字 : Linux , 消息 函數(shù) ,分析 2 目 錄 摘 要 ............................................................ 1 1 課設(shè)簡(jiǎn)介 ........................................................ 3 課程設(shè)計(jì)題目 .................................................... 3 課程設(shè)計(jì)小組成員 ................................................ 3 2 LINUX 的消息函數(shù)主模塊功能描述 ................................... 3 3 LINUX 的消息函數(shù)各個(gè)子模塊功能描述 ............................... 4 Msgget: ...................................................... 4 Msgsnd: ...................................................... 5 Msgrcv: ...................................................... 6 Msgctl: ...................................................... 8 4 LINUX 的消息函數(shù)各個(gè)子模塊相關(guān)函數(shù)代碼分析結(jié)果 ................... 9 有關(guān)常量 、函數(shù) 及相關(guān)錯(cuò)誤信息的含 義: ............................ 9 常量含義: .................................................. 9 錯(cuò)誤信息含義 ................................................ 9 相關(guān)函數(shù)及文件首部含義 ...................................... 9 函數(shù) sys_msgget 的分析 .......................................... 16 代碼及注釋 ................................................. 16 發(fā)送消息函數(shù) real_msgsnd 的分析 ................................. 23 代碼分析 ................................................... 23 接收消息函數(shù) real_msgrcv 的分析 ................................. 28 代碼及注釋 ................................................. 28 函數(shù) sys_msgctl 的分析 .......................................... 33 代碼及注釋 ................................................. 33 心得體會(huì) .......................................................... 42 參考文獻(xiàn) .......................................................... 43 3 1 課設(shè)簡(jiǎn)介 課程設(shè)計(jì)題目 LINUX 的消息函數(shù)的分析 課程設(shè)計(jì)小組成員 ○1 Msgget:孫帥,分析消息隊(duì)列的創(chuàng)建函數(shù)( sys_msgget)以及與它相關(guān)的函數(shù) newque、 findkey、 msg_init,寫(xiě)出代碼分析結(jié)果,明確組內(nèi)成員的明細(xì)分工,總體把握組內(nèi)成員的進(jìn)度。趙松,畫(huà)出流程圖來(lái)表示相關(guān)函數(shù)之間的相互調(diào)用關(guān)系。 消息隊(duì)列允許一個(gè)或多個(gè)進(jìn)程寫(xiě)消息,一個(gè)或多個(gè)進(jìn)程讀取消息。如果進(jìn)程可以 向 這個(gè) 隊(duì)列寫(xiě),則消息會(huì)從進(jìn)程的地址空間寫(xiě)到 msg 數(shù)據(jù)結(jié)構(gòu),放到消息隊(duì)列的最后。如果沒(méi)有符合條件的消息,讀進(jìn)程會(huì)被加到消息 隊(duì)列的讀等待進(jìn)程,然后運(yùn)行調(diào)度程序。主要由 real_msgsnd 執(zhí)行。從消息隊(duì)列中取得指定類型的消息 .。 //消息隊(duì)列 static int msgbytes = 0。 /*任務(wù)列表 */ int r_mode。 struct msg_msgseg {/*每一個(gè)消息都要有 msg_msg 數(shù)據(jù)結(jié)構(gòu) */ struct msg_msgseg* next。/*IPC 許可證 */ time_t q_stime。 /* 最后一個(gè)接受者進(jìn)程的 PID*/ struct list_head q_messages。msg_ids,id)) /* 鎖定IPC*/ define msg_unlock(id) ipc_unlock(amp。/*系統(tǒng)進(jìn)程消息讀取工具 */ endif void __init msg_init (void)/*初始化 */ { ipc_init_ids(amp。msg_ids, amp。 msqq_ctime = CURRENT_TIME。 INIT_LIST_HEAD(amp。 kfree(seg)。 msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL)。msgnext。 segnext = NULL。 out_err: free_msg(msg)。 dest = ((char*)dest)+alen。 } return 0。 } static void ss_wakeup(struct list_head* h, int kill)/*喚醒一個(gè)消息 */ 16 { struct list_head *tmp。 tmp = msq。 struct msqid_ds *msq。amp。 //如果返回值非 0,則不允許訪問(wèn)進(jìn)程間通訊資源 IPC,返回錯(cuò)誤,錯(cuò)誤類型 EACCES(Permission denied) else ret = (unsigned int) msq * MSGMNI + id。 id = max_msqid。 struct ipc_perm *ipcp。 //如果分配失敗,該消息隊(duì)列 (msgque)項(xiàng)目被設(shè)置回 IPC_UNUSED 標(biāo)志 wake_up (amp。 ipcpcuid = ipcpuid = currenteuid。 msqmsg_qbytes = MSGMNB。 if (msgsz MSGMAX || (long) msgsz 0 || msqid 0) //一系列條件判斷消息的大小是否超過(guò)消息的最大值 return EINVAL。msqmsg_perm。 //如果存在正在等待 消息,就會(huì)用進(jìn)程的休眠被信號(hào)中斷的方式來(lái)處理它,返回錯(cuò)誤,錯(cuò)誤類型 EINTR(Interrupted system call) interruptible_sleep_on (amp。 //調(diào)用 kfree 函數(shù)釋放掉 msgh 的空間 return EFAULT。 //如果該消息隊(duì)列中就一個(gè)消息單元,則把指針 msg_first 與 msg_last 指向一塊 else { //如果消息消息隊(duì)列不止一個(gè)消息單元,把當(dāng)前消息單元添加到消息隊(duì)列尾 msqmsg_lastmsg_next = msgh。 wake_up (amp。 if (msqid 0 || (long) msgsz 0) return – EINVAL。 } if (msgtyp == 0) //msgtyp 為 0時(shí)取隊(duì)列中第一條消息 nmsg = msqmsg_first。 tmsg。amp。 31 //則將 nmsgmsg_next 重新置為消息隊(duì)列頭 else { //若所取消息不是消息隊(duì)列頭 for (tmsg = msqmsg_first。 //取消息進(jìn)程號(hào)更新為當(dāng)前進(jìn)程號(hào) msgbytes = nmsgmsg_ts。 //釋放空間 32 return msgsz。 //需不需要 buf 取決于 cmd,而且即使當(dāng)它被使用時(shí)它的含義也將隨情況的不同而不同 。 //根據(jù) cmd的不同進(jìn)行不同的處理 switch (cmd) { case IPC_INFO: case MSG_INFO: //返回所需要的信息到指定的結(jié)構(gòu) struct msginfo 中 if (!buf) goto out。 = MSGSSZ。 //復(fù)制是由 copy_to_user 函數(shù) err = max_msqid。 err = EACCES。 = msqmsg_cbytes。 err = id。 。 //剩下三種情況: IPC_SET、 IPC_STAT,和 IPC_RMID,與上述情況都在 switch 語(yǔ)句里被完全的處理不同,在此僅進(jìn)行部分處理 case IPC_SET: //緩沖區(qū)非空,就將它復(fù)制到 tbuf 里以便后面函數(shù)的進(jìn)一步處理 if (!buf) goto out。 = msqmsg_qbytes。msqmsg_perm, S_IRUGO)) //缺少訪問(wèn)該隊(duì)列的許可,則返回 goto out。 } case MSG_STAT: //返回所需要的統(tǒng)計(jì)信息 — 它的當(dāng)前和最大容量、它的最近的讀者和寫(xiě)者的 PID,等等。 if (cmd == MSG_INFO) { //假如 cmd 是 MSG_INFO 而不是 IPC_INFO 時(shí),還要包括一些額外信息 = used_queues。 /* buffer for msgctl calls IPC_INFO, MSG_INFO */ = M
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1