管道和命名管道
命名管道(named PIPE)
由于基于fork機制,所以管道只能用于父進程和子進程之間,或者擁有相同祖先的兩個子進程之間 (有親緣關系的進程之間)。為了解決這一問題,Linux提供了FIFO方式連接進程。FIFO又叫做命名管道(named PIPE)。
FIFO (First in, First out)為一種特殊的文件類型,它在文件系統中有對應的路徑。當一個進程以讀(r)的方式打開該文件,而另一個進程以寫(w)的方式打開該文件,那么內核就會在這兩個進程之間建立管道,所以FIFO實際上也由內核管理,不與硬盤打交道。之所以叫FIFO,是因為管道本質上是一個先進先出的隊列數據結構,最早放入的數據被最先讀出來,從而保證信息交流的順序。FIFO只是借用了文件系統(file system,命名管道是一種特殊類型的文件,因為Linux中所有事物都是文件,它在文件系統中以文件名的形式存在。)來為管道命名。寫模式的進程向FIFO文件中寫入,而讀模式的進程從FIFO文件中讀出。當刪除FIFO文件時,管道連接也隨之消失。FIFO的好處在于我們可以通過文件的路徑來識別管道,從而讓沒有親緣關系的進程之間建立連接
函數原型:
#include <sys/types.h> #include <sys/stat.h>int mkfifo(const char *filename, mode_t mode); int mknode(const char *filename, mode_t mode | S_IFIFO, (dev_t) 0 );其中pathname是被創建的文件名稱,mode表示將在該文件上設置的權限位和將被創建的文件類型(在此情況下為S_IFIFO),dev是當創建設備特殊文件時使用的一個值。因此,對于先進先出文件它的值為0。
#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main(void) {char buf[80];int fd;unlink("zieckey_fifo");mkfifo("zieckey_fifo",0777);if(fork()>0){char s[]="Hello!\n";fd=open("zieckey_fifo",O_WRONLY);write(fd,s,sizeof(s));//close(fd); }else{fd=open("zieckey_fifo",O_RDONLY);read(fd,buf,sizeof(buf));printf("Themessagefromthepipeis:%s\n",buf);//close(fd); }return 0; } /*執行結果為 Themessagefromthepipeis:Hello! 并且可以在程序執行目錄生成管道文件zieckey_fifo */注意:ls命令的輸出結果中的第一個字符為p,表示這是一個管道。最后的|符號是由ls命令的-F選項添加的,它也表示是這是一個管道。
FIFO讀寫規則
1.從FIFO中讀取數據: 約定:如果一個進程為了從FIFO中讀取數據而阻塞打開了FIFO,那么稱該進程內的讀操作為設置了阻塞標志的讀操作
2.從FIFO中寫入數據: 約定:如果一個進程為了向FIFO中寫入數據而阻塞打開FIFO,那么稱該進程內的寫操作為設置了阻塞標志的寫操作。
詳見:http://blog.csdn.net/MONKEY_D_MENG/article/details/5570468
總結
- 上一篇: 表格 作业题练习
- 下一篇: 基于asp.net + easyui框架