資源描述:
《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