進(jìn)程間通信之:管道
3.使用實(shí)例
下面的實(shí)例包含了兩個程序,一個用于讀管道,另一個用于寫管道。其中在讀管道的程序里創(chuàng)建管道,并且作為main()函數(shù)里的參數(shù)由用戶輸入要寫入的內(nèi)容。讀管道的程序會讀出用戶寫入到管道的內(nèi)容,這兩個程序采用的是阻塞式讀寫管道模式。
以下是寫管道的程序:
/*fifo_write.c*/
#includesys/types.h>
#includesys/stat.h>
#includeerrno.h>
#includefcntl.h>
#includestdio.h>
#includestdlib.h>
#includelimits.h>
#defineMYFIFO/tmp/myfifo/*有名管道文件名*/
#defineMAX_BUFFER_SIZEPIPE_BUF/*定義在于limits.h中*/
intmain(intargc,char*argv[])/*參數(shù)為即將寫入的字符串*/
{
intfd;
charbuff[MAX_BUFFER_SIZE];
intnwrite;
if(argc=1)
{
printf(Usage:./fifo_writestringn);
exit(1);
}
sscanf(argv[1],%s,buff);
/*以只寫阻塞方式打開FIFO管道*/
fd=open(MYFIFO,O_WRONLY);
if(fd==-1)
{
printf(Openfifofileerrorn);
exit(1);
}
/*向管道中寫入字符串*/
if((nwrite=write(fd,buff,MAX_BUFFER_SIZE))>0)
{
printf(Write'%s'toFIFOn,buff);
}
close(fd);
exit(0);
}
以下是讀管道程序:
/*fifo_read.c*/
(頭文件和宏定義同fifo_write.c)
intmain()
{
charbuff[MAX_BUFFER_SIZE];
intfd;
intnread;
/*判斷有名管道是否已存在,若尚未創(chuàng)建,則以相應(yīng)的權(quán)限創(chuàng)建*/
if(access(MYFIFO,F_OK)==-1)
{
if((mkfifo(MYFIFO,0666)0)(errno!=EEXIST))
{
printf(Cannotcreatefifofilen);
exit(1);
}
}
/*以只讀阻塞方式打開有名管道*/
fd=open(MYFIFO,O_RDONLY);
if(fd==-1)
{
printf(Openfifofileerrorn);
exit(1);
}
while(1)
{
memset(buff,0,sizeof(buff));
if((nread=read(fd,buff,MAX_BUFFER_SIZE))>0)
{
printf(Read'%s'fromFIFOn,buff);
}
}
close(fd);
exit(0);
}
為了能夠較好地觀察運(yùn)行結(jié)果,需要把這兩個程序分別在兩個終端里運(yùn)行,在這里首先啟動讀管道程序。讀管道進(jìn)程在建立管道之后就開始循環(huán)地從管道里讀出內(nèi)容,如果沒有數(shù)據(jù)可讀,則一直阻塞到寫管道進(jìn)程向管道寫入數(shù)據(jù)。在啟動了寫管道程序后,讀進(jìn)程能夠從管道里讀出用戶的輸入內(nèi)容,程序運(yùn)行結(jié)果如下所示。
終端一:
$./fifo_read
Read'FIFO'fromFIFO
Read'Test'fromFIFO
Read'Program'fromFIFO
……
終端二:
$./fifo_writeFIFO
Write'FIFO'toFIFO
$./fifo_writeTest
Write'Test'toFIFO
$./fifo_writeProgram
Write'Program'toFIFO
……
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論