不是很了解命名管道先看這個篇博客 http://blog.csdn.net/u011068702/article/details/55102379 linux c之命名管道簡單使用
博客介紹了創建管道的方法,這里還需要介紹 open函數和調用阻塞
FIFO文件也可以使用open調用來打開,mkfifo函數只是創建一個FIFO文件,要使用命名管道還是將其打開。但是有兩點要注意,
1、就是程序不能以O_RDWR模式打開FIFO文件進行讀寫操作,因為如一個管道以讀/寫方式打開,進程就會讀回自己的輸出,同時我們通常使用FIFO只是為了單向 的數據傳遞,要注意是O_REWR,不是O_WRONLY2、就是傳遞給open調用的是FIFO的路徑名,而不是正常的文件。
open API
open(const char *path, O_RDONLY);//1 open(const char *path, O_RDONLY | O_NONBLOCK);//2 open(const char *path, O_WRONLY);//3 open(const char *path, O_WRONLY | O_NONBLOCK);//4open調用的阻塞
open函數第二個參數中,選項O_NONBLOCK表示非阻塞,加上這個選項后,表示open調用是非阻塞的,如果沒有這個選項,則表示open調用是阻塞的。open調用的阻塞到底是什么意思?很簡單,對于以只讀方式(O_RDONLY)打開的FIFO文件,如果open調用是阻塞的(即第二個參數為O_RDONLY),除非有一個進程以寫方式打開同一個FIFO,否則它不會返回;如果open調用是非阻塞的的(即第二個參數為O_RDONLY | O_NONBLOCK),則即使沒有其他進程以寫方式打開同一個FIFO文件,open調用將成功并立即返回。對于以只寫方式(O_WRONLY)打開的FIFO文件,如果open調用是阻塞的(即第二個參數為O_WRONLY),open調用將被阻塞,直到有一個進程以只讀方式打開同一個FIFO文件為止;如果open調用是非阻塞的(即第二個參數為O_WRONLY | O_NONBLOCK),open總會立即返回,但如果沒有其他進程以只讀方式打開同一個FIFO文件,open調用將返回-1,并且FIFO也不會被打開。
2、實現進程通信代碼
實現功能:我們這里有兩個源文件,一個源文件pipe11.c負責從Data.txt里面讀入數據,然后寫入管道,然后pipe12.c源文件是從管道如入數據,然后把讀到的數據寫入write.txt里面去
在pipe11.c的源文件如下
記得加上頭文件
#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<limits.h>#include<string.h>#include<fcntl.h>然后就是pipe12.c的代碼如下
3、運行結果展示
沒有運行之前看下 Data.txt內容為: this is first pipe, I am name is chenyu!然后是沒有創建write.txt文件的
然后我們運行pipe11.c文件效果如下
我么可以看到阻塞了
然后我們運行pipe12.c文件效果如下
然后再去看運行pipe11.c的控制臺
我么可以看到沒有阻塞了,希望可以更好理解阻塞
我們再去看write.txt文件
新聞熱點
疑難解答