




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2021-7-17linux進程間通信1第第4章章 進程間通信進程間通信 32021-7-17linux進程間通信24.7 Linux信號量信號量4.7.1 Linux的信號量的信號量 作為作為IPC機制的一種,與上述其它通信方式類似,機制的一種,與上述其它通信方式類似,也要通過也要通過kern_ipc_perm結(jié)構(gòu)中的結(jié)構(gòu)中的key來唯一標識一來唯一標識一個信號量集,并通過該結(jié)構(gòu)設(shè)置并檢查訪問權(quán)限。個信號量集,并通過該結(jié)構(gòu)設(shè)置并檢查訪問權(quán)限。 針對信號量集,系統(tǒng)中維護了一個由信號量集組成針對信號量集,系統(tǒng)中維護了一個由信號量集組成的數(shù)組,數(shù)組中的每個單元指向一個信號量集。每一的數(shù)組,數(shù)組中的
2、每個單元指向一個信號量集。每一個信號量集由一個個信號量集由一個sem_array結(jié)構(gòu)來描述,該結(jié)構(gòu)定結(jié)構(gòu)來描述,該結(jié)構(gòu)定義在文件義在文件/usr/src/linux-2.4/include/linux/sem.h中。中。2021-7-17linux進程間通信34.7.1 Linux的信號量的信號量2021-7-17linux進程間通信44.7.2 有關(guān)信號量的系統(tǒng)調(diào)用函數(shù)有關(guān)信號量的系統(tǒng)調(diào)用函數(shù)Linux提供下列提供下列3個有關(guān)信號量的系統(tǒng)調(diào)用函數(shù):個有關(guān)信號量的系統(tǒng)調(diào)用函數(shù):semget()semop()semctl()下面分別予以介紹。下面分別予以介紹。2021-7-17linux進程間通
3、信54.7.2 有關(guān)信號量的系統(tǒng)調(diào)用函數(shù)有關(guān)信號量的系統(tǒng)調(diào)用函數(shù)1.創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集命令格式:命令格式:int semget(key_t key, int nsems, int semflg);返回值:返回值:正確返回:信號量集的標識符正確返回:信號量集的標識符錯誤返回:錯誤返回:-12021-7-17linux進程間通信61.創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集參數(shù)說明:參數(shù)說明:key信號量集的信號量集的key值:值:使用使用IPC_PRIVATE,由
4、系統(tǒng)產(chǎn)生,由系統(tǒng)產(chǎn)生key值并返回標識符,或者返回值并返回標識符,或者返回key值已存在的值已存在的信號量集的標識符。信號量集的標識符。 key值不為值不為IPC_PRIVATE而是由用戶指定一個非而是由用戶指定一個非0整型數(shù)值,則對信號量集的打整型數(shù)值,則對信號量集的打開或存取操作依賴于開或存取操作依賴于semflag參數(shù)的取值。參數(shù)的取值。nsems指定打開或者新創(chuàng)建的信號量集將包含的信號量的數(shù)目;如果該指定打開或者新創(chuàng)建的信號量集將包含的信號量的數(shù)目;如果該key值的值的信號量集已存在,而信號量集已存在,而semflg只指定了只指定了IPC_CREAT標志,那么參數(shù)標志,那么參數(shù)nsem
5、s必須與必須與原來的值一致,否則也會返回錯誤信息。該參數(shù)最大值在原來的值一致,否則也會返回錯誤信息。該參數(shù)最大值在linux/sem.h中被定義:中被定義:#define SEMMSL 250 /* = 8 000 */semflg當當key值不為值不為IPC_PRIVATE:若只設(shè)置若只設(shè)置semflag的的IPC_CREAT位,則創(chuàng)建一個信號量集,如果該信號量集已位,則創(chuàng)建一個信號量集,如果該信號量集已經(jīng)存在,則返回其標識符經(jīng)存在,則返回其標識符若設(shè)置若設(shè)置semflag的的IPC_CREAT|IPC_EXCL位,則創(chuàng)建一個新的信號量集,如果位,則創(chuàng)建一個新的信號量集,如果該該key值的信
6、號量集已經(jīng)存在則返回錯誤信息值的信號量集已經(jīng)存在則返回錯誤信息只設(shè)置只設(shè)置IPC_EXCL位而不設(shè)置位而不設(shè)置IPC_CREAT位沒有任何意義。位沒有任何意義。2021-7-17linux進程間通信71.創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集創(chuàng)建一個新的信號量集或獲取一個已經(jīng)存在的信號量集實驗中,使用該調(diào)用創(chuàng)建一個只含一個信號量的信號量集,格式為:semid=semget(IPC_PRIVATE,1, IPC_CREAT|0666);其中的IPC_PRIVATE可以使用具體的整型數(shù)值取代。2021-7-17linux進程間通信82.對信號量的對信號量的P、V操作操作命令格式:命令格式
7、:int semop(int semid, struct sembuf * sops, unsigned nsops);返回值:返回值:正確返回:正確返回:0錯誤返回:錯誤返回:-1參數(shù)說明:參數(shù)說明:semid信號量集的標識符,由信號量集的標識符,由semget()得到。()得到。sops指向一個指向一個sembuf結(jié)構(gòu)數(shù)組,該數(shù)組的每個元素對應(yīng)一次信結(jié)構(gòu)數(shù)組,該數(shù)組的每個元素對應(yīng)一次信號量操作。號量操作。2021-7-17linux進程間通信92.對信號量的對信號量的P、V操作操作其其sembuf數(shù)據(jù)結(jié)構(gòu)如下:數(shù)據(jù)結(jié)構(gòu)如下:struct sembuf unsigned short sem_
8、num; /* semaphore index in array */shortsem_op;/* semaphore operation */shortsem_flg;/* operation flags */;其其中的參數(shù)含義如下所示:中的參數(shù)含義如下所示:2021-7-17linux進程間通信102.對信號量的對信號量的P、V操作操作信號量的信號量的sem_num值標明它是信號量集的第幾個元素,第一個信號量為值標明它是信號量集的第幾個元素,第一個信號量為0,第二個,第二個為為1,依次類推。,依次類推。semop確定對確定對sem_num指定的信號量采取何種操作,它可以為負數(shù)、正數(shù)和零。指
9、定的信號量采取何種操作,它可以為負數(shù)、正數(shù)和零。如果如果sem_op為負數(shù):則相當于為負數(shù):則相當于P操作,從信號量的值中減去操作,從信號量的值中減去sem_op的絕對值:的絕對值: 其差如果大于其差如果大于0,則表示該進程可以使用臨界資源進入臨界區(qū);,則表示該進程可以使用臨界資源進入臨界區(qū); 其差如果小于其差如果小于0,在沒有指定,在沒有指定IPC_NOWAIT的情況下,該進程睡眠,并插入的情況下,該進程睡眠,并插入sem_queues等待隊列尾部,直到請求的條件得到滿足;如果指定了等待隊列尾部,直到請求的條件得到滿足;如果指定了IPC_NOWAIT,則出錯返回。則出錯返回。如果如果sem_
10、op為正數(shù):此時相當于為正數(shù):此時相當于V操作,把它的值加到信號量中,這也意味著該操作,把它的值加到信號量中,這也意味著該進程釋放資源。如果是互斥則出臨界區(qū),釋放臨界資源。進程釋放資源。如果是互斥則出臨界區(qū),釋放臨界資源。如果如果sem_op為為0:則該進程將睡眠直到信號量的值也為:則該進程將睡眠直到信號量的值也為0。系統(tǒng)會按順序檢查信號量等待隊列系統(tǒng)會按順序檢查信號量等待隊列(sem_pending)中的每一個成員,查看在當前信號量中的每一個成員,查看在當前信號量的狀態(tài)下,其請求的操作是否可以成功,如果可以,則將它從等待隊列中喚醒,并的狀態(tài)下,其請求的操作是否可以成功,如果可以,則將它從等待
11、隊列中喚醒,并插入到就緒隊列中等待調(diào)度運行。插入到就緒隊列中等待調(diào)度運行。sem_flg指明操作的執(zhí)行模式,它有兩個標志位:指明操作的執(zhí)行模式,它有兩個標志位: IPC_NOWAIT:指明以非阻塞方:指明以非阻塞方式操作信號量。式操作信號量。 SEM_UNDO: 指明內(nèi)核為信號量操作保留恢復值指明內(nèi)核為信號量操作保留恢復值nsops是第二個參數(shù)所指向的是第二個參數(shù)所指向的sembuf結(jié)構(gòu)數(shù)組中元素的個數(shù),如果只有一個信號結(jié)構(gòu)數(shù)組中元素的個數(shù),如果只有一個信號量量nsops值值為為1。 2021-7-17linux進程間通信112.對信號量的對信號量的P、V操作操作在實驗中,使用該系統(tǒng)調(diào)用實現(xiàn)在
12、實驗中,使用該系統(tǒng)調(diào)用實現(xiàn)P、V操作,使用格式為:操作,使用格式為:struct sembuf P,V;semop(semid, &P, 1); /對信號量對信號量semid執(zhí)行執(zhí)行P操作操作semop(semid, &V, 1); /對信號量對信號量semid執(zhí)行執(zhí)行V操作操作2021-7-17linux進程間通信123信號量集的控制函數(shù)信號量集的控制函數(shù)命令格式:命令格式:int semctl(int semid, int semnum, int cmd, union semun arg);返回值:返回值: 操作成功返回:根據(jù)操作成功返回:根據(jù)cmd的不同返回需要的值或的不同返回需要的值或
13、0 錯誤返回:錯誤返回:-12021-7-17linux進程間通信133信號量集的控制函數(shù)信號量集的控制函數(shù)參數(shù)說明:參數(shù)說明:semid信號量集的標識符,由信號量集的標識符,由semget()得到;()得到;semnum指定指定semid信號量集的第幾個信號量,在信號量集的第幾個信號量,在撤消信號量集時,此參數(shù)可以缺??;撤消信號量集時,此參數(shù)可以缺省;cmd用于指定操作類別:用于指定操作類別: SETVAL:置信號量:置信號量semval域值為域值為arg.val。 IPC_RMID:刪除指定信號量集。能夠進行此項操作:刪除指定信號量集。能夠進行此項操作的 進 程 限 于 超 級 用 戶 、
14、的 進 程 限 于 超 級 用 戶 、 s e m _ p e r m . c u i d 或或sem_perm.uid。2021-7-17linux進程間通信143信號量集的控制函數(shù)信號量集的控制函數(shù)實驗中使用該系統(tǒng)調(diào)用實現(xiàn)以下功能:實驗中使用該系統(tǒng)調(diào)用實現(xiàn)以下功能:為信號量賦初值,格式為:為信號量賦初值,格式為:union semun arg;arg.val=初值初值; semctl(semid,0,SETVAL,arg);其中其中0表示第表示第0個信號量,個信號量,arg的值由的值由arg.val決定,所以必須事先為決定,所以必須事先為arg.val賦值。賦值。撤消信號量集,格式為:撤消
15、信號量集,格式為:semctl(semid,IPC_RMID,0);上述系統(tǒng)調(diào)用使用下列上述系統(tǒng)調(diào)用使用下列頭函數(shù):頭函數(shù):#include#include2021-7-17linux進程間通信154.7.3 信號量及其信號量及其P、V操作的實現(xiàn)操作的實現(xiàn)信號量及其信號量及其P、V操作的實現(xiàn)方式歸納如下:操作的實現(xiàn)方式歸納如下:1 定義信號量標識符:定義信號量標識符:int semid;如果有如果有n個信號量,則需要分別定義個信號量,則需要分別定義n個不同的信號量標識符。個不同的信號量標識符。2 定義信號量數(shù)據(jù)結(jié)構(gòu)定義信號量數(shù)據(jù)結(jié)構(gòu)定義定義P、V操作所用的數(shù)據(jù)結(jié)構(gòu):操作所用的數(shù)據(jù)結(jié)構(gòu):stru
16、ct sembuf P,V; 定義給信號量賦初值的參數(shù)數(shù)據(jù)結(jié)構(gòu):定義給信號量賦初值的參數(shù)數(shù)據(jù)結(jié)構(gòu):union semun arg;3 申請只有一個信號量的信號量集申請只有一個信號量的信號量集semid=semget(IPC_PRIVITE,1,IPC_0666);其中,第一個參數(shù):其中,第一個參數(shù):IPC_PRIVATE由系統(tǒng)產(chǎn)生由系統(tǒng)產(chǎn)生key值,也可以由用戶使用具值,也可以由用戶使用具體的整型數(shù)值作為體的整型數(shù)值作為key值指定;第二個參數(shù)表示信號量集中只有一個信值指定;第二個參數(shù)表示信號量集中只有一個信號量;操作權(quán)限取決于最后一個參數(shù),號量;操作權(quán)限取決于最后一個參數(shù),0666表示任意用
17、戶可讀可寫,只表示任意用戶可讀可寫,只設(shè)置設(shè)置semflag的的IPC_CREAT位,則創(chuàng)建一個信號量集,如果該信號量集位,則創(chuàng)建一個信號量集,如果該信號量集已經(jīng)存在,則返回其標識符。已經(jīng)存在,則返回其標識符。4 分別對每個信號量分別對每個信號量semid賦初值賦初值arg.val=初值初值;semctl(semid,0,SETVAL,arg);2021-7-17linux進程間通信164.7.3 信號量及其信號量及其P、V操作的實現(xiàn)操作的實現(xiàn)5. 定義信號量的定義信號量的P操作(供所有信號量的操作(供所有信號量的P操作使用)操作使用)P.sem_num=0;P.sem_op=-1;/*-1表
18、示表示P操作時對信號量減操作時對信號量減1*/P.sem_flg=SEM_UNDO;6. 定義信號量的定義信號量的V操作(供所有信號量的操作(供所有信號量的V操作使用)操作使用)V.sem_num=0;V.sem_op=1;/*1表示表示V操作時對信號量加操作時對信號量加1*/V.sem_flg=SEM_UNDO;7. 對信號量對信號量semid執(zhí)行執(zhí)行P操作:操作:semop(semid,&P,1);8. 對信號量對信號量semid執(zhí)行執(zhí)行V操作:操作:semop(semid,&V,1);9. 撤消信號量:撤消信號量:semctl(semid,IPC_RMID,0);因為信號量不是普通變量,
19、對它賦初值只能通過系統(tǒng)調(diào)用函數(shù)因為信號量不是普通變量,對它賦初值只能通過系統(tǒng)調(diào)用函數(shù)semctl(semid,0,SETVAL,arg)進行,進行,其值的修改只能通過其值的修改只能通過P、V操作,而操作,而不能使用普通的賦值語句。不能使用普通的賦值語句。因此其初值和信號量的因此其初值和信號量的P、V操作需要事先定義好以后,然后才能在進程中執(zhí)行操作需要事先定義好以后,然后才能在進程中執(zhí)行P、V操作。操作。2021-7-17linux進程間通信174.7.4 應(yīng)用舉例應(yīng)用舉例1.利用信號量實現(xiàn)進程互斥利用信號量實現(xiàn)進程互斥例例4-9 設(shè)有父子設(shè)有父子2個進程共享一個臨界資源,每個進程循環(huán)進入該個進
20、程共享一個臨界資源,每個進程循環(huán)進入該臨界區(qū)臨界區(qū)3次:父進程每次進入臨界區(qū)后顯示次:父進程每次進入臨界區(qū)后顯示“prnt in”,出臨界區(qū),出臨界區(qū)則顯示則顯示“prnt out”;子進程每次進入臨界區(qū)后顯示;子進程每次進入臨界區(qū)后顯示“chld in”出出臨界區(qū)則顯示臨界區(qū)則顯示“chld out”。觀察運行結(jié)果,應(yīng)該是一個進程出來。觀察運行結(jié)果,應(yīng)該是一個進程出來后另一個才能進去。后另一個才能進去。分析:分析:對臨界區(qū)設(shè)置互斥信號量對臨界區(qū)設(shè)置互斥信號量mutex,其內(nèi)部標識為,其內(nèi)部標識為mutexid,初值為,初值為1。程序中使用睡眠延時程序中使用睡眠延時1秒來模擬進入臨界區(qū)前和進入
21、后所執(zhí)行的程序。秒來模擬進入臨界區(qū)前和進入后所執(zhí)行的程序。2021-7-17linux進程間通信18程序清單:文件名程序清單:文件名sem.c#include#include#include#include#includeint mutexid;/定義信號量標識定義信號量標識int main()int chld,i,j;/*定義數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)結(jié)構(gòu)*/struct sembuf P,V;union semun arg;/*創(chuàng)建只含有一個互斥信號量元素的信號量集創(chuàng)建只含有一個互斥信號量元素的信號量集*/mutexid=semget(IPC_PRIVATE,1,0666|IPC_CREAT);/*
22、為信號量賦初值為信號量賦初值*/arg.val=1;if(semctl(mutexid,0,SETVAL,arg)=-1)perror(semctl setval error);2021-7-17linux進程間通信19 /*定義定義P、V操作操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;while(chld=fork()=-1); /創(chuàng)建子進程創(chuàng)建子進程if(chld0) /父進程返回父進程返回i=1;while(i=3)/循環(huán)循環(huán)3次次sleep(1);sem
23、op(mutexid,&P,1); /進入臨界區(qū)前執(zhí)行進入臨界區(qū)前執(zhí)行P操作操作printf(prnt inn);sleep(1);printf(prnt outn);semop(mutexid,&V,1); /出臨界區(qū)執(zhí)行出臨界區(qū)執(zhí)行V操作操作i+;wait(0);/等待子進程終止等待子進程終止semctl(mutexid,IPC_RMID,0);/撤消信號量撤消信號量exit(0);2021-7-17linux進程間通信20else/子進程返回子進程返回j=1;while(j=3)/循環(huán)循環(huán)3次次sleep(1);semop(mutexid,&P,1); /進入臨界區(qū)前執(zhí)行進入臨界區(qū)前執(zhí)行
24、P操作操作printf(chld inn);sleep(1);printf(chld outn);semop(mutexid,&V,1); /出臨界區(qū)執(zhí)行出臨界區(qū)執(zhí)行V操作操作j+;exit(0);/子進程終止子進程終止2021-7-17linux進程間通信21編譯連接及運行結(jié)果:編譯連接及運行結(jié)果:2021-7-17linux進程間通信222.利用信號量實現(xiàn)進程同步利用信號量實現(xiàn)進程同步例例4-10 父進程創(chuàng)建一個子進程,父子進程共享一個存儲區(qū),子進程向共享父進程創(chuàng)建一個子進程,父子進程共享一個存儲區(qū),子進程向共享存儲區(qū)中以覆蓋方式寫信息,父進程從該共享存儲區(qū)中讀信息并顯示信存儲區(qū)中以覆蓋方
25、式寫信息,父進程從該共享存儲區(qū)中讀信息并顯示信息。父子進程輪流讀寫,即子進程寫一個信息到共享內(nèi)存中,父進程從息。父子進程輪流讀寫,即子進程寫一個信息到共享內(nèi)存中,父進程從中讀該信息輸出;然后子進程再寫第中讀該信息輸出;然后子進程再寫第2個信息,父進程再讀出第個信息,父進程再讀出第2個信息個信息輸出,如圖輸出,如圖4 6所示。當信息為所示。當信息為“end”時讀寫進程結(jié)束。時讀寫進程結(jié)束。父進程父進程子進程子進程單緩沖區(qū)單緩沖區(qū)圖圖4 6 單緩沖區(qū)同步問題單緩沖區(qū)同步問題2021-7-17linux進程間通信232.利用信號量實現(xiàn)進程同步利用信號量實現(xiàn)進程同步同步分析:同步分析:這是一個單緩沖區(qū)
26、同步問題,在第這是一個單緩沖區(qū)同步問題,在第3章中已經(jīng)討論過這類問題的同步章中已經(jīng)討論過這類問題的同步算法,讀寫緩沖區(qū)的兩個進程之間只需要同步不需要互斥,請參算法,讀寫緩沖區(qū)的兩個進程之間只需要同步不需要互斥,請參閱閱3.3.6節(jié)中的節(jié)中的單緩沖區(qū)同步問題單緩沖區(qū)同步問題。同步算法:同步算法:子進程執(zhí)行條件為單緩沖區(qū)有空,設(shè)信號量子進程執(zhí)行條件為單緩沖區(qū)有空,設(shè)信號量empty,初值為,初值為1;父進程執(zhí)行條件為單緩沖區(qū)有數(shù),設(shè)信號量父進程執(zhí)行條件為單緩沖區(qū)有數(shù),設(shè)信號量full,初值為,初值為0;上述信號量可以由父進程定義、申請、初始化,然后由父子進程共上述信號量可以由父進程定義、申請、初始
27、化,然后由父子進程共享使用,子進程結(jié)束后由父進程撤消。享使用,子進程結(jié)束后由父進程撤消。共享內(nèi)存設(shè)計:共享內(nèi)存設(shè)計:父子進程共享一個內(nèi)存區(qū),可以由父進程申請、附接,然后由父子父子進程共享一個內(nèi)存區(qū),可以由父進程申請、附接,然后由父子進程共享使用,子進程結(jié)束后由父進程撤消。進程共享使用,子進程結(jié)束后由父進程撤消。2021-7-17linux進程間通信24程序清單,文件名為程序清單,文件名為sem2.c:#include#include#include#include#include#include#include/*定義信號量內(nèi)部標識定義信號量內(nèi)部標識*/int emptyid;int full
28、id;main()int chld,i,j;/*定義信號量數(shù)據(jù)結(jié)構(gòu)定義信號量數(shù)據(jù)結(jié)構(gòu)*/struct sembuf P,V;union semun arg;/*定義共享內(nèi)存定義共享內(nèi)存*/int shmid;char *viraddr;char bufferBUFSIZ;2021-7-17linux進程間通信25 /*創(chuàng)建信號量并初始化創(chuàng)建信號量并初始化*/emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);arg.val=1;if(semctl(emptyid,0,S
29、ETVAL,arg)=-1)perror(semctl setval error);arg.val=0;if(semctl(fullid,0,SETVAL,arg)=-1)perror(semctl setval error);/*定義定義P、V操作操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;/*創(chuàng)建并附接共享內(nèi)存創(chuàng)建并附接共享內(nèi)存*/shmid=shmget(IPC_PRIVATE,BUFSIZ,0666|IPC_CREAT);viraddr=(char*)s
30、hmat(shmid,0,0);2021-7-17linux進程間通信26while(chld=fork()=-1);/創(chuàng)建子進程創(chuàng)建子進程if(chld0)/父進程返回讀信息并輸出父進程返回讀信息并輸出 while(1) semop(fullid,&P,1);/對對fullid執(zhí)行執(zhí)行P操作操作printf(Your message is:n%s,viraddr);semop(emptyid,&V,1);/對對emptyid執(zhí)行執(zhí)行V操作操作if(strncmp(viraddr,end,3)=0)break; wait(0);/等待子進程終止等待子進程終止shmdt(viraddr);/斷開
31、附接的共享內(nèi)存斷開附接的共享內(nèi)存shmctl(shmid,IPC_RMID,0);/撤消共享內(nèi)存和信號量集撤消共享內(nèi)存和信號量集semctl(emptyid,IPC_RMID,0);semctl(fullid,IPC_RMID,0);printf(Parent ok!n);exit(0);2021-7-17linux進程間通信27else/子進程返回寫信息到共享內(nèi)存子進程返回寫信息到共享內(nèi)存while(1)semop(emptyid,&P,1);/對對emptyid執(zhí)行執(zhí)行P操作操作puts(Enter your text:);fgets(buffer,BUFSIZ,stdin);/鍵盤輸入信
32、息鍵盤輸入信息strcpy(viraddr,buffer); /寫信息到共享內(nèi)存中(覆蓋方式)寫信息到共享內(nèi)存中(覆蓋方式)semop(fullid,&V,1);/對對fullid執(zhí)行執(zhí)行V操作操作if(strncmp(viraddr,end,3)=0)sleep(1); /睡眠睡眠1秒,等待父進程將秒,等待父進程將end取走取走break;printf(Child ok!n);exit(0);2021-7-17linux進程間通信28運行結(jié)果:運行結(jié)果:由結(jié)果可以看出,子進程寫到單緩沖區(qū)中的信息,父進程都依次取由結(jié)果可以看出,子進程寫到單緩沖區(qū)中的信息,父進程都依次取出并輸出了。出并輸出了。
33、2021-7-17linux進程間通信292.利用信號量實現(xiàn)進程同步利用信號量實現(xiàn)進程同步例例4-11 設(shè)父進程創(chuàng)建一個子進程作為生產(chǎn)者,創(chuàng)建兩個子進程作設(shè)父進程創(chuàng)建一個子進程作為生產(chǎn)者,創(chuàng)建兩個子進程作為消費者,這三個子進程使用一個共享內(nèi)存,該共享內(nèi)存定義為為消費者,這三個子進程使用一個共享內(nèi)存,該共享內(nèi)存定義為具有具有5個變量的數(shù)組,每個變量表示一個緩沖區(qū),緩沖區(qū)號為個變量的數(shù)組,每個變量表示一個緩沖區(qū),緩沖區(qū)號為04。生產(chǎn)者進程依次往緩沖區(qū)。生產(chǎn)者進程依次往緩沖區(qū)04中寫中寫10個數(shù)據(jù)個數(shù)據(jù)110,兩個讀進,兩個讀進程依次從緩沖區(qū)程依次從緩沖區(qū)04中輪流取出這中輪流取出這10個數(shù)據(jù)。使用信號量實現(xiàn)進個數(shù)據(jù)。使用信號量實現(xiàn)進程讀寫緩沖區(qū)的同步和互斥。程讀寫緩沖區(qū)的同步和互斥。生產(chǎn)者消費者同步問題生產(chǎn)者消費者同步問題消費者消費者A進程進程消費者消費者B進程進程生產(chǎn)者進程生產(chǎn)者進程013242021-7-17linux進程間通信302.利用信號量實現(xiàn)進程同步利用信號量實現(xiàn)進程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手機器買賣服務(wù)合同范本
- 2025年惠州貨運上崗證模擬考試0題
- 業(yè)務(wù)外合同范本
- 2025年景德鎮(zhèn)貨運資格證考試答案
- 供應(yīng)商代發(fā)合同范本
- 臨時用工解除協(xié)議合同范本
- 初設(shè)評審合同范本
- 書供貨采購合同范本
- 佛山團購合同范本
- 買車合作合同范本
- 一至六年級下冊音樂期末試卷及答案
- 黃金太陽漆黑的黎明金手指
- 節(jié)水灌溉理論與技術(shù)
- 多介質(zhì)過濾器計算書
- 鑼鼓曲譜16762
- 三、QHLY系列——露頂式弧形門閘門液壓啟閉機
- 工商企業(yè)管理專業(yè)專科畢業(yè)論文
- 皮帶機提升機鏈運機功率計算
- 《病毒性肝炎》課件.ppt
- 法恩莎衛(wèi)浴潔具價格表
- 干部職工《出國境管理辦法》政策解讀及工作要求PPT課件
評論
0/150
提交評論