1. 程式人生 > >linux c之用命名管道實現程序通訊

linux c之用命名管道實現程序通訊

1、命名管道相關資訊介紹

部落格介紹了建立管道的方法,這裡還需要介紹 open函式和呼叫阻塞

FIFO檔案也可以使用open呼叫來開啟,mkfifo函式只是建立一個FIFO檔案,要使用命名管道還是將其開啟。

但是有兩點要注意,

1、就是程式不能以O_RDWR模式開啟FIFO檔案進行讀寫操作,因為如一個管道以讀/寫方式開啟,程序就會讀回自己的輸出,同時我們通常使用FIFO只是為了單向  的資料傳遞,要注意是O_REWR,不是O_WRONLY
2、就是傳遞給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);//4  

open呼叫的阻塞

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檔案