資源描述:
《linux下c語言編程--進(jìn)程通信、消息管理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux下C語言編程--進(jìn)程通信、消息管理 作者:hoyt前言:Linux下的進(jìn)程通信(IPC)1.POSIX無名信號(hào)量2.SystemV信號(hào)量3.SystemV消息隊(duì)列4.SystemV共享內(nèi)存--------------------------------------------------------------------------------1。POSIX無名信號(hào)量如果你學(xué)習(xí)過操作系統(tǒng),那么肯定熟悉PV操作了.PV操作是原子操作.
2、也就是操作是不可以中斷的,在一定的時(shí)間內(nèi),只能夠有一個(gè)進(jìn)程的代碼在CPU上面執(zhí)行.在系統(tǒng)當(dāng)中,有時(shí)候?yàn)榱隧樌氖褂煤捅Wo(hù)共享資源,大家提出了信號(hào)的概念.假設(shè)我們要使用一臺(tái)打印機(jī),如果在同一時(shí)刻有兩個(gè)進(jìn)程在向打印機(jī)輸出,那么最終的結(jié)果會(huì)是什么呢.為了處理這種情況,POSIX標(biāo)準(zhǔn)提出了有名信號(hào)量和無名信號(hào)量的概念,由于Linux只實(shí)現(xiàn)了無名信號(hào)量,我們?cè)谶@里就只是介紹無名信號(hào)量了.信號(hào)量的使用主要是用來保護(hù)共享資源,使的資源在一個(gè)時(shí)刻只有一個(gè)進(jìn)程所擁有.為此我們可以使用一個(gè)信號(hào)燈.當(dāng)信號(hào)燈的值為某個(gè)值的時(shí)候,就
3、表明此時(shí)資源不可以使用.否則就表>示可以使用.為了提供效率,系統(tǒng)提供了下面幾個(gè)函數(shù)POSIX的無名信號(hào)量的函數(shù)有以下幾個(gè):#includeintsem_init(sem_t*sem,intpshared,unsignedintvalue);intsem_destroy(sem_t*sem);intsem_wait(sem_t*sem);intsem_trywait(sem_t*sem);intsem_post(sem_t*sem);intsem_getvalue(sem_t*sem);sem_init創(chuàng)建一
4、個(gè)信號(hào)燈,并初始化其值為value.pshared決定了信號(hào)量能否在幾個(gè)進(jìn)程間共享.由于目前Linux還沒有實(shí)現(xiàn)進(jìn)程間共享信號(hào)燈,所以這個(gè)值只能夠取0.sem_destroy是用來刪除信號(hào)燈的.sem_wait調(diào)用將阻塞進(jìn)程,直到信號(hào)燈的值大于0.這個(gè)函數(shù)返回的時(shí)候自動(dòng)的將信號(hào)燈的值的件一.sem_post和sem_wait相反,是將信號(hào)燈的內(nèi)容加一同時(shí)發(fā)出信號(hào)喚醒等待的進(jìn)程..sem_trywait和sem_wait相同,不過不阻塞的,當(dāng)信號(hào)燈的值為0的時(shí)候返回EAGAIN,表示以后重試.sem_getv
5、alue得到信號(hào)燈的值.由于Linux不支持,我們沒有辦法用源程序解釋了.這幾個(gè)函數(shù)的使用相當(dāng)簡(jiǎn)單的.比如我們有一個(gè)程序要向一個(gè)系統(tǒng)打印機(jī)打印兩頁.我們首先創(chuàng)建一個(gè)信號(hào)燈,并使其初始值為1,表示我們有一個(gè)資源可用.然后一個(gè)進(jìn)程調(diào)用sem_wait由于這個(gè)時(shí)候信號(hào)燈的值為1,所以這個(gè)函數(shù)返回,打印機(jī)開始打印了,同時(shí)信號(hào)燈的值為0了.如果第二個(gè)進(jìn)程要打印,調(diào)用sem_wait時(shí)候,由于信號(hào)燈的值為0,資源不可用,于是被阻塞了.當(dāng)?shù)谝粋€(gè)進(jìn)程打印完成以后,調(diào)用sem_post信號(hào)燈的值為1了,這個(gè)時(shí)候系統(tǒng)通知第二個(gè)
6、進(jìn)程,于是第二個(gè)進(jìn)程的sem_wait返回.第二個(gè)進(jìn)程開始打印了.不過我們可以使用線程來解決這個(gè)問題的.我們會(huì)在后面解釋什么是線程的.編譯包含上面這幾個(gè)函數(shù)的程序要加上-lrt選賢,以連接librt.so庫2。SystemV信號(hào)量為了解決上面哪個(gè)問題,我們也可以使用SystemV信號(hào)量.很幸運(yùn)的是Linux實(shí)現(xiàn)了SystemV信號(hào)量.這樣我們就可以用實(shí)例來解釋了.SystemV信號(hào)量的函數(shù)主要有下面幾個(gè).#include#include#includekey_tftok(char*pathname,char
7、proj);intsemget(key_tkey,intnsems,intsemflg);intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);intsemop(intsemid,structsembuf*spos,intnspos);structsembuf{shortsem_num;/*使用那一個(gè)信號(hào)*/shortsem_op;/*進(jìn)行什么操作*/shortsem_flg;/*操作的標(biāo)志*/};ftok函數(shù)是根據(jù)pathname和proj來創(chuàng)建一個(gè)關(guān)鍵字.
8、semget創(chuàng)建一個(gè)信號(hào)量.成功時(shí)返回信號(hào)的ID,key是一個(gè)關(guān)鍵字,可以是用ftok創(chuàng)建的也可以是IPC_PRIVATE表明由系統(tǒng)選用一個(gè)關(guān)鍵字.nsems表明我們創(chuàng)建的信號(hào)個(gè)數(shù).semflg是創(chuàng)建的權(quán)限標(biāo)志,和我們創(chuàng)建一個(gè)文件的標(biāo)志相同.semctl對(duì)信號(hào)量進(jìn)行一系列的控制.semid是要操作的信號(hào)標(biāo)志,semnum是信號(hào)的個(gè)數(shù),cmd是操作的命令.經(jīng)常用的兩個(gè)值是:SETVAL(設(shè)置信號(hào)量的值)和IPC_R