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

正文內(nèi)容

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

2024-09-03 13:51本頁(yè)面
  

【正文】 = msg_seq。 ipcpcuid = ipcpuid = currenteuid。 S_IRWXUGO)。msqmsg_perm。 //一旦發(fā)現(xiàn)有 IPC_NOID 就激活任何已經(jīng)休眠的findkey return ENOMEM。 //如果分配失敗,該消息隊(duì)列 (msgque)項(xiàng)目被設(shè)置回 IPC_UNUSED 標(biāo)志 wake_up (amp。 //如果循環(huán)結(jié)束但是消息隊(duì)列 (msgque)中沒(méi)有未使用的指針,則返回錯(cuò)誤,錯(cuò)誤類(lèi)型 ENOSPC(No space left on device)表示沒(méi)有剩余的空間 found: //對(duì)未使用的這個(gè)指針進(jìn)行初始化設(shè)置 msq = (struct msqid_ds *) kmalloc (sizeof (*msq), GFP_KERNEL)。 //如果找到了未使用的 msgque 項(xiàng),就用 IPC_NOID 來(lái)標(biāo)記它 goto found。 id MSGMNI。 struct ipc_perm *ipcp。 //循環(huán)結(jié)束,但是仍然未找到相互匹配的鍵值,則返回值- 1 以表示失敗 } 流程圖: 20 創(chuàng)建消息隊(duì)列函數(shù) newque 的分析: static int newque (key_t key, int msgflg) //定位 一個(gè)沒(méi)有使用的 msgque項(xiàng),并嘗試在那里創(chuàng)建一個(gè)新的消息隊(duì)列 { int id。 //如果該消息隊(duì)列 (msgque)的項(xiàng)目未被使用,那么該消息隊(duì)列 (msgque)明顯不具有匹配的鍵值 if (key == msq) //判斷鍵值是否匹配 return id。msg_lock)。 id = max_msqid。 struct msqid_ds *msq。//釋放內(nèi)核 return ret。這個(gè)編號(hào)將成為調(diào)用者要傳遞給 sys_msgsnd、 sys_msgrcv,以及 sys_msgctl的 msgid 參數(shù)。 //如果返回值非 0,則不允許訪問(wèn)進(jìn)程間通訊資源 IPC,返回錯(cuò)誤,錯(cuò)誤類(lèi)型 EACCES(Permission denied) else ret = (unsigned int) msq * MSGMNI + id。 //如果當(dāng)前消息隊(duì)列 (msgque)項(xiàng)目指向被設(shè)置 IPC_UNUSED或被設(shè)置 IPC_NOID,則該地方?jīng)]有消息隊(duì)列 (msgque)或者調(diào)用者缺少訪問(wèn)它的權(quán)限返回錯(cuò)誤,錯(cuò)誤類(lèi)型 EACCES(Identifier removed) else if (ipcperms(amp。 //如果調(diào)用的參數(shù) msgflg 中既設(shè)置了 IPC_CREAT(00001000)位,又設(shè)置了 IPC_EXCL(00002020)位,則返回錯(cuò)誤,錯(cuò)誤類(lèi)型 EEXIST(File exists) } else { //如果有 key 這個(gè)鍵值指定的隊(duì)列,則使用這個(gè)鍵值所指明的隊(duì)列作為當(dāng)前消息隊(duì)列 msq = msgque[id]。 IPC_EXCL) { //key 這個(gè)鍵值已被使用。amp。 //如果調(diào)用的參數(shù) msgflg 中沒(méi)有設(shè)置IPC_CREAT(00001000)位 ,則調(diào)用 newque 函數(shù)新建一個(gè)隊(duì)列,并返回新建隊(duì)列的序列號(hào) ID } else if (msgflg amp。 IPC_CREAT)) //如果 key 鍵值未被使用,則判斷調(diào)用的參數(shù)msgflg 中是否設(shè)置了 IPC_CREAT(00001000)位 ret = ENOENT。 //鎖內(nèi)核 if (key == IPC_PRIVATE) //判斷調(diào)用的參數(shù) key中是否指定了 IPC_PRIVATE 即 17 判斷調(diào)用者需要一個(gè)新隊(duì)列; ret = newque(key, msgflg)。 struct msqid_ds *msq。 wake_up_process(msrr_tsk)。 tmp = tmpnext。msqq_receivers) { struct msg_receiver* msr。 tmp = msq。 wake_up_process(msstsk)。 tmp = tmpnext。 while (tmp != h) { struct msg_sender* mss。 } static void ss_wakeup(struct list_head* h, int kill)/*喚醒一個(gè)消息 */ 16 { struct list_head *tmp。 } static inline void ss_del(struct msg_sender* mss)/*刪除一個(gè)發(fā)送者的消息 */ { if(mss != NULL) list_del(amp。msslist,amp。 currentstate=TASK_INTERRUPTIBLE。 } return 0。 dest = ((char*)dest)+alen。 if(copy_to_user (dest, seg+1, alen)) return 1。 while(len 0) { alen = len。 dest = ((char*)dest)+alen。 if(copy_to_user (dest, msg+1, alen)) return 1。 15 alen = len。 } static int store_msg(void* dest, struct msg_msg* msg, int len)/*存儲(chǔ)消息 */ { int alen。 out_err: free_msg(msg)。 src = ((char*)src)+alen。segnext。 goto out_err。 segnext = NULL。 goto out_err。 seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL)。 alen = len。msgnext。 14 src = ((char*)src)+alen。 goto out_err。 msgnext = NULL。 msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL)。 alen = len。 int err。 } } static struct msg_msg* load_msg(void* src, int len)/*加載消息 */ { struct msg_msg* msg。 kfree(seg)。 kfree(msg)。 } static void free_msg(struct msg_msg* msg)/*釋放一個(gè)消息 */ 13 { struct msg_msgseg* seg。 msg_unlock(id)。 INIT_LIST_HEAD(amp。 INIT_LIST_HEAD(amp。 INIT_LIST_HEAD(amp。 msqq_qbytes = msg_ctlmnb。 msqq_ctime = CURRENT_TIME。 msq = key。 } msq = (msgflg amp。 if(id == 1) { kfree(msq)。msg_ids, amp。/*初始化 */ if (!msq) return ENOMEM。/*ID號(hào) */ struct msg_queue *msq。 ifdef CONFIG_PROC_FS create_proc_read_entry(sysvipc/msg, 0, 0, sysvipc_msg_read_proc, NULL)。/*系統(tǒng)進(jìn)程消息讀取工具 */ endif void __init msg_init (void)/*初始化 */ { ipc_init_ids(amp。/*釋放一個(gè)進(jìn)程 隊(duì)列 */ static int newque (key_t key, int msgflg)。msqq_perm,msgid) define msg_buildid(id, seq) /* 創(chuàng)建一個(gè)消息隊(duì)列類(lèi)型的 IPC 資源標(biāo)示符 */ ipc_buildid(amp。msg_ids,id)) define msg_checkid(msq, msgid) /* 檢查 IPC*/ ipc_checkid(amp。msg_ids,id)) /* 鎖定IPC*/ define msg_unlock(id) ipc_unlock(amp。/**/ static struct ipc_ids msg_ids。 11 define SEARCH_ANY 1/*搜索全部 */ define SEARCH_EQUAL 2/*搜索相等的 */ define SEARCH_NOTEQUAL 3/*搜索不相等的 */ define SEARCH_LESSEQUAL 4/*搜索小于等于的 */ static atomic_t msg_bytes = ATOMIC_INIT(0)。 /* 消息接收者的隊(duì)列 */ struct list_head q_senders。 /* 最后一個(gè)接受者進(jìn)程的 PID*/ struct list_head q_messages。 /*隊(duì)列的最大字節(jié)數(shù) */ pid_t q_lspid。 /*隊(duì)列當(dāng)前的字節(jié)數(shù) */ unsigned long q_qnum。 /* 最后接收時(shí)間 */ time_t q_ctime。/*IPC 許可證 */ time_t q_stime。 /*下一個(gè)消息 */ }。 /*消息類(lèi)型 */ int m_ts。 struct msg_msg { //: msg 消息隊(duì)列數(shù)據(jù)結(jié)構(gòu) :// struct list_head m_list。 struct msg_msgseg {/*每一個(gè)消息都要有 msg_msg 數(shù)據(jù)結(jié)構(gòu) */ struct msg_msgseg* next。 /* 等待發(fā)送者進(jìn)程列表 */ struct task_struct* tsk。 /* 消息結(jié)構(gòu) */ }。 /* 等待的消息模型 */ long r_maxsize。 /*任務(wù)列表 */ int r_mode。 //消息隊(duì)列鎖定,不讓等待進(jìn)程進(jìn)入 相關(guān)錯(cuò) 誤信息的含義 : EINVAL 22 /* Invalid argument */ EFAULT 14 /* Bad address */ EIDRM 43 /* Identifier removed */ EACCES 13 /* Permission denied */ EAGAIN 11 /* Try again */ EINTR 4 /* Interrupted system call */ ENOMEM 12 /* Out of memory */ E2BIG 7 /* Arg list too long */ ENOMSG 42 /* No message of desired type */ ENOSPC 28 /* No space left on device */ ENOMEM 12 /* Out of memory */ EPERM 1 /* Operation not permitted */ ENOENT 2 /* No such file or directory */ EEXIST 17 /* File exists */ 相關(guān)函數(shù)及文 件首部含義: struct msg_receiver { struct list_head r_list。 //已用的消息隊(duì)列數(shù) static int max_msqid = 0。 //消息隊(duì)列的隊(duì)頭 static unsigned short msg_seq = 0。 //消息隊(duì)列 static int msgbytes = 0。主要由 sys_msgctl 執(zhí)行。IPC_NOWAIT)不是真的 ,則調(diào)用進(jìn)程會(huì)被掛起直到下面情況之一發(fā)生 : 隊(duì)列中的消息的類(lèi)型是有效的 . 消息隊(duì)列標(biāo)志被系統(tǒng)刪除 .系統(tǒng)調(diào)用返回 1. 調(diào)用進(jìn)程接收到未被忽略的中斷信號(hào) ,調(diào)用進(jìn)程繼續(xù)執(zhí)行或被終止 . 調(diào)用成功后 ,對(duì)應(yīng)指定的消息隊(duì)列的相關(guān)結(jié)構(gòu)做如下動(dòng)作 : 消息數(shù) (msg_qnum)減 1. 消息隊(duì)列最近接收進(jìn)程號(hào) (msg_lrpid)改為調(diào)用進(jìn)程號(hào) . 消息隊(duì)列接收時(shí)間 (msg_rtime)改為當(dāng)前系統(tǒng)時(shí) 間 .
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1