新聞中心

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

進程間通信之:管道

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

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

8.2.5FIFO

1.有名說明

前面介紹的是無名,它只能用于具有親緣關系的之間,這就大大地限制了管道的使用。有名管道的出現(xiàn)突破了這種限制,它可以使互不相關的兩個實現(xiàn)彼此通信。該管道可以通過路徑名來指出,并且在文件系統(tǒng)中是可見的。在建立了管道之后,兩個就可以把它當作普通文件一樣進行讀寫操作,使用非常方便。不過值得注意的是,F(xiàn)IFO是嚴格地遵循先進先出規(guī)則的,對管道及FIFO的讀總是從開始處返回數(shù)據(jù),對它們的寫則把數(shù)據(jù)添加到末尾,它們不支持如lseek()等文件定位操作。

有名管道的創(chuàng)建可以使用函數(shù)mkfifo(),該函數(shù)類似文件中的open()操作,可以指定管道的路徑和打開的模式。

小知識

用戶還可以在命令行使用“mknod管道名p”來創(chuàng)建有名管道。

在創(chuàng)建管道成功之后,就可以使用open()、read()和write()這些函數(shù)了。與普通文件的開發(fā)設置一樣,對于為讀而打開的管道可在open()中設置O_RDONLY,對于為寫而打開的管道可在open()中設置O_WRONLY,在這里與普通文件不同的是阻塞問題。由于普通文件的讀寫時不會出現(xiàn)阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標志可以在open()函數(shù)中設定為O_NONBLOCK。下面分別對阻塞打開和非阻塞打開的讀寫進行討論。

(1)對于讀進程。

n 若該管道是阻塞打開,且當前FIFO內沒有數(shù)據(jù),則對讀進程而言將一直阻塞到有數(shù)據(jù)寫入。

n 若該管道是非阻塞打開,則不論FIFO內是否有數(shù)據(jù),讀進程都會立即執(zhí)行讀操作。即如果FIFO內沒有數(shù)據(jù),則讀函數(shù)將立刻返回0。

(2)對于寫進程。

n 若該管道是阻塞打開,則寫操作將一直阻塞到數(shù)據(jù)可以被寫入。

n 若該管道是非阻塞打開而不能寫入全部數(shù)據(jù),則讀操作進行部分寫入或者調用失敗。

2.mkfifo()函數(shù)格式

表8.4列出了mkfifo()函數(shù)的語法要點。

表8.4 mkfifo()函數(shù)語法要點

所需頭文件

#includesys/types.h>
#includesys/state.h>

函數(shù)原型

intmkfifo(constchar*filename,mode_tmode)

函數(shù)傳入值

filename:要創(chuàng)建的管道

函數(shù)傳入值

mode:

O_RDONLY:讀管道

O_WRONLY:寫管道

O_RDWR:讀寫管道

O_NONBLOCK:非阻塞

函數(shù)傳入值

mode:

O_CREAT:如果該文件不存在,那么就創(chuàng)建一個新的文件,并用第三個參數(shù)為其設置權限

O_EXCL:如果使用O_CREAT時文件存在,那么可返回錯誤消息。這一參數(shù)可測試文件是否存在

函數(shù)返回值

成功:0

出錯:-1

表8.5再對FIFO相關的出錯信息做一歸納,以方便用戶查錯。

表8.5 FIFO相關的出錯信息

EACCESS

參數(shù)filename所指定的目錄路徑無可執(zhí)行的權限

EEXIST

參數(shù)filename所指定的文件已存在

ENAMETOOLONG

參數(shù)filename的路徑名稱太長

ENOENT

參數(shù)filename包含的目錄不存在

ENOSPC

文件系統(tǒng)的剩余空間不足

ENOTDIR

參數(shù)filename路徑中的目錄存在但卻非真正的目錄

EROFS

參數(shù)filename指定的文件存在于只讀文件系統(tǒng)內

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

linux相關文章:linux教程


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


通信相關文章:通信原理




評論


相關推薦

技術專區(qū)

關閉