Linux 進(jìn)程間通信知識點(diǎn)總結(jié)_第1頁
Linux 進(jìn)程間通信知識點(diǎn)總結(jié)_第2頁
Linux 進(jìn)程間通信知識點(diǎn)總結(jié)_第3頁
Linux 進(jìn)程間通信知識點(diǎn)總結(jié)_第4頁
Linux 進(jìn)程間通信知識點(diǎn)總結(jié)_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Linux進(jìn)程間通信知識點(diǎn)總結(jié)進(jìn)程間通信(IPC)是指在不同進(jìn)程之間傳播或交換信息。進(jìn)程間通信的方式主要有以下6鐘:管道(Pipe)信號(Singal)信號量(Semaphore)共享內(nèi)存(sharedmemory)消息隊(duì)列(MessageQueue)套接字(Socket)下面對6種方式進(jìn)行詳細(xì)介紹:管道1、管道分為有名管道和無名管道,通常指無名管道。2、無名管道特點(diǎn):(1)它是半雙工的(即數(shù)據(jù)只能在一個(gè)方向上流動(dòng)),具有固定的讀端和寫端。(2)它只能用于具有親緣關(guān)系的進(jìn)程之間的通信(也是父子進(jìn)程或者兄弟進(jìn)程之間)。(3)對于它的讀寫也可以使用普通的read、write等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中。3、缺點(diǎn):速度慢,容量有限,只有父子進(jìn)程能通訊。4、管道的創(chuàng)建及使用:調(diào)用pipe()函數(shù)創(chuàng)建一個(gè)管道,再通過fork()函數(shù)創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程繼承父進(jìn)程所創(chuàng)建的管道,為實(shí)現(xiàn)父子進(jìn)程間的讀寫,只需把無關(guān)的讀端或?qū)懚说奈募枋龇P(guān)閉即可。若要數(shù)據(jù)流從父進(jìn)程流向子進(jìn)程,則關(guān)閉父進(jìn)程的讀端(fd[0])與子進(jìn)程的寫端(fd[1]);反之,則可以使數(shù)據(jù)流從子進(jìn)程流向父進(jìn)程。5、父子進(jìn)程在運(yùn)行時(shí),先后順序并不能保證。可以在進(jìn)程中添加sleep()函數(shù)。6、標(biāo)流管道:管道的操作也支持基于文件流的模式,這種基于文件流的管道主要是用來創(chuàng)建一個(gè)連接到另一個(gè)進(jìn)程的管道,這里的“另一個(gè)進(jìn)程”也就是一個(gè)可以進(jìn)行一定操作的可執(zhí)行文件。7、因此標(biāo)準(zhǔn)流管道就將一系列的創(chuàng)建過程合并到一個(gè)函數(shù)popen()中完成。它所完成的工作有以下幾步:(1)創(chuàng)建一個(gè)管道(2)fork()一個(gè)子進(jìn)程(3)在父進(jìn)程中關(guān)閉不必要的文件描述符(4)執(zhí)行exec函數(shù)族調(diào)用(5)執(zhí)行函數(shù)中所指定的命令8、popen()函數(shù)的使用減少了代碼的編寫量,但是靈活性不如pipe()函數(shù)所創(chuàng)建的管道,并且使用popen()創(chuàng)建的管道必須使用標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行操作,但不能使用read()、write()一類不帶緩沖的I/O函數(shù)。open()創(chuàng)建的流管道必須使用函數(shù)pclose()來關(guān)閉該管道流。9、有名管道特點(diǎn):有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。它是一個(gè)設(shè)備文件,提供一個(gè)路徑名與FIFO關(guān)聯(lián)。10、有名管道缺點(diǎn):任何進(jìn)程間都能通訊,但速度慢。11、使用有名管道需先調(diào)用open函數(shù)將其打開,設(shè)置讀寫端的權(quán)限,若只是以只讀或只寫方式打開,會(huì)阻塞到有讀或?qū)懛绞酱蜷_管道為止。若同時(shí)以讀寫方式打開,一定不阻塞。12、有名管道的阻塞打開和非阻塞打開:(1)讀進(jìn)程若管道阻塞打開,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則讀進(jìn)程一直阻塞到有數(shù)據(jù)寫入。若管道非阻塞打開,不論FIFO內(nèi)是否有數(shù)據(jù),讀進(jìn)程都立刻執(zhí)行讀操作。即FIFO內(nèi)沒有數(shù)據(jù),該函數(shù)就立刻返回0。寫進(jìn)程若管道阻塞打開,寫操作一直阻塞到有數(shù)據(jù)可以被寫入。若管道是非阻塞打開且不能寫入全部數(shù)據(jù),讀操作進(jìn)行部分寫入或者調(diào)用失敗。13、除了調(diào)用myfifo()函數(shù)之外,有名管道還可以通過“mknod管道名p”的方式創(chuàng)建。信號信號是軟件層次上對中斷機(jī)制的模擬,是一種異步通信方式。信號值在32之前有不同的名稱,在32后都是以“SIGRTMIN”和“SIGRTMAX”開頭的,這是兩類典型的信號量。信號主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。一個(gè)完整的信號生命周期可以分為3個(gè)階段,這個(gè)3個(gè)階段由4個(gè)重要事件來表示:信號的產(chǎn)生、信號在進(jìn)程中注冊、信號在進(jìn)程中注銷、執(zhí)行信號處理函數(shù)。發(fā)送信號的函數(shù)主要有kill()、raise()、alarm()以及pause()。kill()函數(shù):中止進(jìn)程,向進(jìn)程發(fā)送其他信號。raise()函數(shù):允許進(jìn)程向自身發(fā)送信號。alarm()函數(shù):在進(jìn)程中設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器指定時(shí)間到時(shí),就會(huì)向進(jìn)程發(fā)送SIGALARM信號。pause()函數(shù):將調(diào)用進(jìn)程掛起直至捕捉到信號為止,通常用于判斷信號是否移到。信號的處理方法:Singal():可以用函數(shù)signal注冊一個(gè)信號捕捉函數(shù)。原型為:

#include

typedefvoid(*sighandler_t)(int);

sighandler_tsignal(intsignum,sighandler_thandler);

signal的第1個(gè)參數(shù)signum表示要捕捉的信號,第2個(gè)參數(shù)是個(gè)函數(shù)指針,表示要對該信號進(jìn)行捕捉的函數(shù),該參數(shù)也可以是SIG_DEF(表示交由系統(tǒng)缺省處理,相當(dāng)于白注冊了)或SIG_IGN(表示忽略掉該信號而不做任何處理)。signal如果調(diào)用成功,返回以前該信號的處理函數(shù)的地址,否則返回SIG_ERR。

sighandler_t是信號捕捉函數(shù),由signal函數(shù)注冊,注冊以后,在整個(gè)進(jìn)程運(yùn)行過程中均有效,并且對不同的信號可以注冊同一個(gè)信號捕捉函數(shù)。該函數(shù)只有一個(gè)參數(shù),表示信號值。Sigaction():函數(shù)原型:

#include<signal.h>

intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);

sigaction也用于注冊一個(gè)信號處理函數(shù)。

參數(shù)signum為需要捕捉的信號;

參數(shù)act是一個(gè)結(jié)構(gòu)體,里面包含信號處理函數(shù)地址、處理方式等信息。

參數(shù)oldact是一個(gè)傳出參數(shù),sigaction函數(shù)調(diào)用成功后,oldact里面包含以前對signum的處理方式的信息。

如果函數(shù)調(diào)用成功,將返回0,否則返回-1。信號量信號量是一個(gè)計(jì)數(shù)器,用于實(shí)現(xiàn)進(jìn)程間的互斥與同步,而不是用于存儲進(jìn)程間通信數(shù)據(jù)。信號量的值是指當(dāng)前可用資源的數(shù)量,通常是對信號量進(jìn)行PV操作。P操作:有資源時(shí)候(信號量值>0)則占用一個(gè)資源(信號量減1);若沒有資源(信號量=0),則被阻塞直到系統(tǒng)將資源分配給該進(jìn)程(進(jìn)入等待隊(duì)列,一直等到資源輪到該進(jìn)程)。V操作:若等待隊(duì)列中有進(jìn)程在等待資源,則喚醒一個(gè)阻塞進(jìn)程。如果沒有進(jìn)程等待它,則釋放一個(gè)資源(給信號量值加1)。3、缺點(diǎn):不能傳遞復(fù)雜消息,只能用來同步。4、信號量的應(yīng)用步驟:創(chuàng)建信號量或獲得在系統(tǒng)中已存在的信號量--semget()初始化信號量--semctl()的SETVAL操作,信號量初始化為1對信號量進(jìn)行PV操作--semop()刪除無用的信號量--semclt()的IPC_RMID操作5、在實(shí)例中,通常是先對父進(jìn)程執(zhí)行操作,但由于信號量處置為0父進(jìn)程阻塞,轉(zhuǎn)至執(zhí)行子進(jìn)程,在子進(jìn)程執(zhí)行結(jié)束后方可執(zhí)行父進(jìn)程操作。如果不加信號量,則父進(jìn)程會(huì)先執(zhí)行完畢。共享內(nèi)存共享內(nèi)存是指兩個(gè)或多個(gè)進(jìn)程共享一個(gè)給定的存儲區(qū)。是進(jìn)程間通信最快的方式。特點(diǎn):共享內(nèi)存是最快的一種IPC,因?yàn)檫M(jìn)程是直接對內(nèi)存進(jìn)行存取。因?yàn)槎鄠€(gè)進(jìn)程可以同時(shí)操作,所以需要進(jìn)行同步。信號量+共享內(nèi)存通常結(jié)合在一起使用,信號量用來同步對共享內(nèi)存的訪問。使用流程創(chuàng)建共享內(nèi)存shmget() 映射共享內(nèi)存shmat()撤銷映射shmdt()使用實(shí)例:首先創(chuàng)建一個(gè)共享內(nèi)存區(qū),之后創(chuàng)建子進(jìn)程,在父子進(jìn)程中將共享內(nèi)存分別映射到各自的進(jìn)程地址空間中。父進(jìn)程等待用戶輸入,將鍵入的數(shù)據(jù)寫入到共享內(nèi)存中,之后往共享內(nèi)存的頭部寫入標(biāo)識字符串表示父進(jìn)程成功寫入數(shù)據(jù)。子進(jìn)程一直等到共享內(nèi)存的頭部字符串為標(biāo)識字符,然后將其打印在屏幕上。父子進(jìn)程完成以上操作后,分別解除與共享內(nèi)存的映射關(guān)系。最后在子進(jìn)程中刪除共享內(nèi)存。消息隊(duì)列消息隊(duì)列就是消息的列表,用戶可以從中添加消息和讀取消息。消息存在于內(nèi)核中,由隊(duì)列ID來標(biāo)識。它在系統(tǒng)內(nèi)核中是以消息鏈表的形式出現(xiàn),消息鏈表中節(jié)點(diǎn)的結(jié)構(gòu)用msg聲明。消息隊(duì)列的實(shí)現(xiàn)包括打開消息隊(duì)列、添加消息、讀取消息和控制消息隊(duì)列這4種操作。(1)創(chuàng)建或打開消息隊(duì)列

msgget()(2)添加消息

msgsnd()(3)讀取消息

msgrcv()

----同F(xiàn)IFO不同的是,這里可以指定取走某一條消息(4)控制消息隊(duì)列

msgctl()消息的發(fā)送端和接收端不需要額外的實(shí)現(xiàn)進(jìn)程間的同步。發(fā)送端發(fā)送的消息類型設(shè)置為該進(jìn)程的進(jìn)程號,接收端根據(jù)消息類型確定消息發(fā)送者的類型號。優(yōu)點(diǎn):消息隊(duì)列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。缺點(diǎn):容量受到系統(tǒng)限制,且要注意第一次讀的時(shí)候,要考慮上一次沒有讀完數(shù)據(jù)的問題套接字socket是一種文件描述符,不僅可實(shí)現(xiàn)本機(jī)上進(jìn)程的通信,還可以實(shí)現(xiàn)不同機(jī)器間的進(jìn)程通信。套接字的特性有三個(gè)屬性確定,它們是:域(domain),類型(type),和協(xié)議(protocol)。套接字域指定套接字通信中使用的網(wǎng)絡(luò)介質(zhì)。最常見的套接字域是AF_INET(IPv4)或者AF_INET6(IPV6),它是指Internet網(wǎng)絡(luò)。套接字類型:流套接字、數(shù)據(jù)報(bào)套接字、原始套接字。套接字協(xié)議有TCP協(xié)議和UDP協(xié)議。TCP協(xié)議可靠性高可減少錯(cuò)誤發(fā)生的概率,UDP協(xié)議靈活性高可減少網(wǎng)絡(luò)負(fù)荷。通信機(jī)制:首先服務(wù)端建立socket套接字可使得其可接受客戶端socket套接字請求,然后調(diào)用bind綁定函數(shù),將本機(jī)IP地址和本地監(jiān)聽與客戶端相連的端口號綁在一起,形成半相關(guān)的套接字。再運(yùn)行客戶端,也使得本機(jī)IP地址和端口號綁定,可向服務(wù)端發(fā)送請求。然后即可監(jiān)聽客戶端向服務(wù)端發(fā)送的連接請求,若有請求accept,無請求則一直監(jiān)聽。此時(shí)服務(wù)端和客戶端可進(jìn)行雙向通信。通信結(jié)束后關(guān)閉通道。網(wǎng)絡(luò)高級編程:作用:解決I/O多路復(fù)用fcntl():fcntl可實(shí)現(xiàn)對指定文件描述符的各種操作,其函數(shù)原型如下:intfcntl(intfd,intcmd,.../*arg*/);操作類型由cmd決定。cmd可取如下值:F_DUPFD:復(fù)制文件描述符F_DUPFD_CLOEXEC:復(fù)制文件描述符,新文件描述符被設(shè)置了close-on-exe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論