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

正文內(nèi)容

linu進(jìn)程間通信-文庫吧資料

2025-01-05 01:06本頁面
  

【正文】 定信號燈集的每個成員的 semval值。 ? GETNCNT:把 semnt的當(dāng)前值作為函數(shù)值返回。如果操作成功,那么相應(yīng)信號燈在所在進(jìn)程中的調(diào)整值 (semadj)將被置為 0。 Linux 培 訓(xùn) semop命令選項 ? GETVAL:把 semval的當(dāng)前值作為函數(shù)返回值返回。 ? 該聯(lián)合沒有出現(xiàn)在任何系統(tǒng)頭文件中,由應(yīng)用程序聲明。 /* used fro IPC_SET and IPC_STAT */ – ushort *array。它是一個聯(lián)合: – union semun { – int val。 ? semnum標(biāo)識某個信號燈, semnum僅僅用于 GETVAL、 SETVAL、GETNCNT、 GETZCNT和 GETPID命令。 } Linux 培 訓(xùn) semctl函數(shù) ? include sys/ ? int semctl(int semid, int semnum, int cmd, …/* union arg */)。 return (1)。 = SEM_UNDO。 = 0。 } return 0。 if (semop(sem_id, sb, 1) == 1) { fprintf(stderr, semaphore_p failed\n)。 = 1。 Linux 培 訓(xùn) semop的調(diào)用問題 ? semop采用復(fù)雜的信號燈集做參數(shù) ,因此造成程序調(diào)用變得復(fù)雜 . ? 信號燈的值加 1,或值減 1都在 semop完成 ,相當(dāng)于加鎖或解鎖都是有一個函數(shù)完成 ,這也是與其它互質(zhì)量等其它同步機(jī)制不一樣的地方 ? 一般是將其封裝成 P,V原語的函數(shù)來操作 /* 申請資源 ,用 P原語 */ int semaphore_wait_p(int sem_id) { struct sembuf sb。當(dāng)調(diào)用進(jìn)程終止時, semadj的值就加到相應(yīng)信號燈的 semval上。若指定了 IPC_NOWAIT,則調(diào)用線程不會睡眠,返回 EAGAIN。如果 semval大于或等于 sem_op的絕對值,則從 semval中減掉 sem_op的絕對值,如果指定了 SEM_UNDO,那么 sem_op的絕對值就加到相應(yīng)信號燈的 semadj值上。若指定了 IPC_NOWAIT,則調(diào)用線程不會睡眠,返回 EAGAIN。如果指定了 SEM_UNDO標(biāo)志,就從相應(yīng)信號燈的 semadj值中減掉 sem_op的值。 ? semop函數(shù)由內(nèi)核保證原子的執(zhí)行,內(nèi)核或者完成所有操作,或者什么也不做。特定的信號燈由 sem_num指定; sem_op指定特定的操作; sem_flg指定非阻塞 (IPC_NOWAIT)、恢復(fù)等標(biāo)志。 ? nops參數(shù)指出結(jié)構(gòu)數(shù)組中元素的個數(shù)。 /* semaphore operation: 0,0, 0 */ – short sem_flg。 ? opsptr指向如下結(jié)構(gòu)模板的數(shù)組 (該結(jié)構(gòu)可能不止如下幾個成員 ): – struct sembuf { – shrot sem_num。 ? 這樣將會造成程序相當(dāng)復(fù)雜 Linux 培 訓(xùn) semop函數(shù) ? include sys/ ? int semop(int semid, struct sembuf *opsptr, size_t nops)。到時就可斷定該信號燈已經(jīng)被初始化,而且對它初始化的進(jìn)程已成功完成 semop調(diào)用。該成員只是在 semop調(diào)用成功時才被設(shè)置為當(dāng)前值。 Linux 培 訓(xùn) 信號量創(chuàng)建問題 ? SystemV信號燈的創(chuàng)建和初始化需兩次函數(shù)調(diào)用是一個致命的缺陷,這會導(dǎo)致競爭狀態(tài)的出現(xiàn)。 ? 當(dāng)實際操作為創(chuàng)建一個新的信號燈集時, semid_ds結(jié)構(gòu)的以下成員將被初始化: – sem_perm結(jié)構(gòu)的 uid和 cuid被設(shè)置為調(diào)用進(jìn)程的有效用戶 ID, gid和 cgid被設(shè)置為調(diào)用進(jìn)程的有效組 ID; – oflag參數(shù)中的讀寫權(quán)限存入 ; – sem_otime被設(shè)置為 0, sem_ctime被置為當(dāng)前時間; – sem_nsems被置為 nsems參數(shù)的值; – 與該集合中每個信號燈關(guān)聯(lián)的各個 sem結(jié)構(gòu)并不初始化。如果不是創(chuàng)建一個信號燈集,而只是訪問已存在的集合,則該參數(shù)可以指定為 0。 ? 返回值是信號燈標(biāo)識符,供其他信號燈函數(shù)使用。 – linux可以增加或減小信號量的值,相應(yīng)于對共享資源的釋放和占有 ? semctl 對信號量進(jìn)行各種控制 – int semctl(int semid, int semnum, int cmd, union semun arg) Linux 培 訓(xùn) semget函數(shù) ? include sys/ ? int semget(key_t key, int nsems, int oflag)。 return (semop(semid,sops,1))。操作為:釋放一個被占用的資源(把信號量加 1),如果發(fā)現(xiàn)有被阻塞的進(jìn)程,則選擇一個喚醒之 – V原語的操作過程 ? sem加 1; ? 若相加結(jié)果大于零,則進(jìn)程繼續(xù)執(zhí)行; ? 若相加結(jié)果小于或等于零,則從該信號的等待隊列中喚醒一等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。 } Linux 培 訓(xùn) 關(guān)于 V原語 ? V原語 – V是荷蘭語 Verhogen(增加)的首字母。 – System V 實現(xiàn)代碼 int p(int semid) { struct sembuf sops={0,+1,IPC_NOWAIT}。為阻塞原語,負(fù)責(zé)把當(dāng)前進(jìn)程由運行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài),直到另外一個進(jìn)程喚醒它。 /* awaiting semval = 0 */ – }。 /* pid of last operation */ – unsigned short semnt。定義如下: – struct sem { – signed short semval。 /* last change time */ – }。 /* of semaphores in set */ – time_t sem_otime。 /* operation permission struct */ – struct sem *sem_base。 Linux 培 訓(xùn) 信號量集的數(shù)據(jù)結(jié)構(gòu) ? SystemV信號燈是信號燈集的概念:一個或多個信號燈構(gòu)成一個集合。每個信號燈都有一個值,可以用來表示當(dāng)前該信號燈代表的共享資源可用( available)數(shù)量, ? 如果一個進(jìn)程要申請共享資源,那么就從信號燈值中減去要申請的數(shù)目,如果當(dāng)前沒有足夠的可用資源,進(jìn)程可以睡眠等待,也可以立即返回。 ? 信號量相當(dāng)是一個全局的整數(shù)變量 ,這個變量只能用原子操作來改變值 ? 信號燈與其它進(jìn)程間通信方式有所不同,它主要用于進(jìn)程間同步。 return。 Linux 培 訓(xùn) 消息隊列打開 ? 如果沒有調(diào)用 msgctl(semid,IPC_RMID,0)刪除消息隊列 ,則消息隊列一直存在內(nèi)核中 ,即便是創(chuàng)建進(jìn)程已經(jīng)退出也是如此 ,這個用 ipcs可以看到 ? 如果對一個已經(jīng)創(chuàng)建的消息隊列的路徑再次創(chuàng)建消息隊列 ,通常都會出錯 .因此可以采用一種保險的寫法 /* 首先查詢這個隊列是否創(chuàng)建,如創(chuàng)建直接用它 */ if((msgid =msgget(key,IPC_EXCL|0666)) == 1) { /*沒有創(chuàng)建才去創(chuàng)建這個消息隊列 */ msgid=msgget(key,IPC_CREAT|IPC_EXCL|00666)。它們的值來自 buff指向的結(jié)構(gòu)中的相應(yīng)成員。第三個參數(shù)忽略不用。當(dāng)前在該隊列上的任何消息都被丟棄。 ? 返回:成功時為 0,出錯時為 1 ? 該函數(shù)提供在一個消息隊列上的各種控制操作。在沒有消息時,若設(shè)置了IPC_NOWAIT標(biāo)志,則函數(shù)立即返回一個 ENOMSG錯誤;否則,調(diào)用者阻塞直到如下某個時間發(fā)生: ? 有一個所請求類型的消息可獲??; ? 由 msqid標(biāo)識的消息隊列被刪除,此時返回個 EIDRM錯誤; ? 被某個捕獲的信號中斷,此時返回 EINTR錯誤。 – type小于 0,返回其類型值小于或等于 type參數(shù)的絕對值的消息中類型值最小的第一個消息。每個消息隊列是作為一個 FIFO鏈表維護(hù)的,所以返回的是隊列中最早的消息。該長度不包含長整數(shù)類型字段。 ? length指定由 ptr指向的緩沖區(qū)中數(shù)據(jù)部分的大小。 ? ptr參數(shù)指定所接收消息的存放位置。 Linux 培 訓(xùn) msgrcv函數(shù) ? include sys/ ? ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag)。 – 若設(shè)置了 IPC_NOWAIT,則 msgsnd立即返回,返回一個 EAGAIN錯誤。 IPC_NOWAIT標(biāo)志使得 msgsnd調(diào)用非阻塞。這是位于長整數(shù)消息類型之后的用戶自定義數(shù)據(jù)的長度,該長度可以是 0。 ? 消息類型 mtype必須大于 0,因為非正消息類型有特殊的指示作用。 /* message type, must be 0 */ – char mtext[ 1 ]。 ? 返回:成功時為 0,出錯時為 1 ? 該函數(shù)用于往消息隊列上放置一個消息。 ? 當(dāng)創(chuàng)建一個消息隊列時, msqid_ds結(jié)構(gòu)的如下成員被初始化: – msg_perm結(jié)構(gòu)的 uid和 cuid被設(shè)置為當(dāng)前進(jìn)程的有效用戶 ID
點擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1