新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 進程間通信之:管道

進程間通信之:管道

作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

本文引用地址:http://2s4d.com/article/257127.htm

3.使用實例

下面的實例包含了兩個程序,一個用于讀,另一個用于寫。其中在讀的程序里創(chuàng)建管道,并且作為main()函數(shù)里的參數(shù)由用戶輸入要寫入的內容。讀管道的程序會讀出用戶寫入到管道的內容,這兩個程序采用的是阻塞式讀寫管道模式。

以下是寫管道的程序:

/*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)建,則以相應的權限創(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);

}

為了能夠較好地觀察運行結果,需要把這兩個程序分別在兩個終端里運行,在這里首先啟動讀管道程序。讀管道在建立管道之后就開始循環(huán)地從管道里讀出內容,如果沒有數(shù)據(jù)可讀,則一直阻塞到寫管道向管道寫入數(shù)據(jù)。在啟動了寫管道程序后,讀能夠從管道里讀出用戶的輸入內容,程序運行結果如下所示。

終端一:

$./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相關文章:linux教程


數(shù)字通信相關文章:數(shù)字通信原理


通信相關文章:通信原理



上一頁 1 2 3 4 5 下一頁

評論


相關推薦

技術專區(qū)

關閉