linux管道通信編程.pdf

linux管道通信編程.pdf

ID:57731722

大?。?95.22 KB

頁數(shù):5頁

時(shí)間:2020-03-25

linux管道通信編程.pdf_第1頁
linux管道通信編程.pdf_第2頁
linux管道通信編程.pdf_第3頁
linux管道通信編程.pdf_第4頁
linux管道通信編程.pdf_第5頁
資源描述:

《linux管道通信編程.pdf》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、linux管道通信編程首先說明linux進(jìn)程之間通信的主要方式。大型程序大多會涉及到某種形式的進(jìn)程間通信,一個(gè)較大型的應(yīng)用程序設(shè)計(jì)成可以相互通信的“碎片”,從而就把一個(gè)任務(wù)分到多個(gè)進(jìn)程中去。進(jìn)程間通信的方法有三種方式:1,管道(pipe)2,SystemvIPC機(jī)制,包括消息隊(duì)列,信號量,共享內(nèi)存3,套接字(socket)管道機(jī)制在UNIX開發(fā)的早期就已經(jīng)提供了,它在本機(jī)上的兩個(gè)進(jìn)程間的數(shù)據(jù)傳遞表現(xiàn)的相當(dāng)出色;套接字是在BSD(BerkeleySoftwareDevelopment)中出現(xiàn)的,現(xiàn)

2、在的應(yīng)用也相當(dāng)?shù)膹V泛;而SystemVIPC機(jī)制UnixSystemV版本中出現(xiàn)的。首先講管道機(jī)制,會在以后把其他的通信機(jī)制都講到。管道分為pipe(無名管道)和FIFO(命名管道),它們都是通過內(nèi)核緩沖區(qū)按先進(jìn)先出的方式數(shù)據(jù)傳輸,管道一端順序地寫入數(shù)據(jù),另一端順序地讀入數(shù)據(jù)讀寫的位置都是自動增加,數(shù)據(jù)只讀一次,之后就被釋放。1,PIPE無名管道調(diào)用格式為intpipe(intfiledes[2]);,文件描述符filedes[0]用來讀數(shù)據(jù),filedes[1]用來寫數(shù)據(jù)。如果要求程序的可移植

3、性好,就按照習(xí)慣的用法來編程。調(diào)用成功時(shí),返回值為0;錯(cuò)誤時(shí),返回-1,并設(shè)置錯(cuò)誤代碼errno:管道在用戶程序看起來就像一個(gè)打開的文件,通過read(filedes[0],void*_buf,size_t_nypes);或者write(filedes[1],void*_buf,size_t_nypes)向這個(gè)文件讀寫數(shù)據(jù)其實(shí)是在讀寫內(nèi)核緩沖區(qū)。下面給出實(shí)例:#include#include#includeintmain(intargc,

4、char*argv[]){intpipedes[2];//pipe輸入輸出文件描述符chars[13]="helloworld!";intpid;if(pipe(pipedes)==-1)//創(chuàng)建管道失敗{perror("pipeerror!");exit(EXIT_FAILURE);}if(pid=fork()<0)//創(chuàng)建子進(jìn)程失敗{perror("forkiserror!");return-1;}elseif(pid==0)//在子進(jìn)程中{printf("now,writedatato

5、pipe");if(write(pipedes[1],s,13)==-1){perror("writeerror!");exit(EXIT_FAILURE);}else{printf("thewrittendatais:%s",s);exit(EXIT_SUCCESS);}}elseif(pid>0)//在父進(jìn)程中{sleep(4);//保證子進(jìn)程寫操作完成printf("nowreaddatafrompipe!");if(read(pipedes[0],s,13)==-1){per

6、ror("readerror!");exit(EXIT_FAILURE);}printf("thedatais%s",s);}return0;}運(yùn)行結(jié)果如圖:達(dá)到預(yù)期效果。2,有名管道無名管道時(shí)臨時(shí)的,在完成通信后就自動消失,且只能在具有親元關(guān)系的進(jìn)程間實(shí)現(xiàn)通信。有名管道他是一個(gè)存在的特殊文件,可以在不同的進(jìn)程間進(jìn)行通信。用戶可以使用shell來創(chuàng)建有名管道,也可以使用mkfifo函數(shù)來創(chuàng)建有名管道,可以使用read和write進(jìn)行讀寫操作。下面直接給出操作實(shí)例:fifo_read.c/**

7、管道通信:有名管道*無名管道只能用于具有親緣關(guān)系的進(jìn)程之間,而有名管道可以在互不相關(guān)的兩個(gè)進(jìn)程間*實(shí)現(xiàn)彼此通信。要注意,F(xiàn)IFO嚴(yán)格按照先進(jìn)先出的規(guī)則,對管道及FIFO的讀總是從開始*處返回?cái)?shù)據(jù),對它們的寫則把數(shù)據(jù)添加到末尾,不支持lseek等文件定位操作。**有名管道的創(chuàng)建使用mkfifo()。創(chuàng)建成功后就可以使用open、read、write這些函數(shù)了。*讀管道部分*/#include#include#include#include<

8、errno.h>#include#include#include#include/*在這里設(shè)置打開管道文件的mode為只讀形式*/#defineFIFOMODE(O_CREAT

9、O_RDWR

10、O_NONBLOCK)#defineOPENMODE(O_RDONLY

11、O_NONBLOCK)#defineFIFO_SERVER"myfifo"intmain(void){charbuf[100];intfd;intr

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。