使用FIFO來進行兩個程序間的通訊

2021-08-21 04:14:27 字數 1865 閱讀 1205

使用命名管道的操作和使用普通的文字檔案類似,都是系統呼叫open函式去開啟建立好的管道,使用read,write函式操作,操作完成後用close函式關閉。

從fifo中讀取資料的規則是:

1,如果乙個程序為了從fifo中讀取資料而阻塞開啟fifo,n那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。

2,如果有程序寫開啟了fifo,而且當前fifo內沒有資料,則對於這於設定了阻塞標誌的讀操作來說,將一直阻塞,對於沒有設定阻塞標誌讀操作來說則返回-1,當前errno值為egin,提醒以後再試。

3,對於設定阻塞標誌的讀操作來說,造成阻塞的原因有兩種:① 當前fifo內有資料,但有其他的程序在讀這些資料。②fifo裡面沒有資料。解阻塞的原因則是fifo有新的資料寫入不管新寫入資料量的大小,也不論讀操作請求多少資料。

4,讀開啟的阻塞標誌只對本程序第乙個讀操作施加作用,如果本程序內有多個讀操作序列,則在第乙個讀操作被喚醒並完成讀操作後,其他要執行的讀操作將不再阻塞。即使在執行讀操作時,fifo裡面沒有資料也一樣(讀操作返回0)。

5,如果沒有寫程序開啟fifo,則設定了阻塞標誌的讀操作也會阻塞。

向fifo中寫入資料的規則是:

1.如果乙個程序為了向fifo中寫資料而阻塞開啟fifo,那麼稱該程序內的寫操作為設定了阻塞標誌的寫操作。

2.對於設定了阻塞標誌的寫操作,當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性,如果此時管道空閒緩衝區不足以容納要寫入的資料時,則進入睡眠,知道當緩衝區能夠容下要寫入資料位元組數時,才開始進行一次性寫操作。

3.當要寫入的資料量大於pipe_buf時,linux不能保證寫入的原子性,在寫滿fifo空閒緩衝區後,寫操作返回。

4.要寫入的資料量不大於pipe_buf時,linux將保證寫入原子性,如果當前緩衝區能容下要寫的資料,則寫完後返回,相反的話,返回eagin錯誤,提醒以後再寫。

write_fifo.c:

#include

#include

#include

#include

#include

#include

#include

#include

#define bufes pipe_buf

intmain

(void)

for(i=

0;i<

10;i++)

sleep(

3);}

close(fd);

exit(

0);}

read_fifo.c

#include

#include

#include

#include

#include

#include

#include

#define bufes pipe_buf

intmain

(void)

while((len=read(fd,buf,bufes))>

0)close(fd);

exit(

0);return

0;

}

step 1:     lishun@lishun-qt:~$ mkfifo -m 0666 fifo1   (建立管道)

step2:     gcc write_fifo.c -o write

ste2:       ./write     (write 當前 阻塞,一直到執行read)

step3:     gcc read_fifo.c -o read

step4:     ./read

git 兩個repository間進行Merge時

git 兩個repository間進行merge時,按照如下手順,假設a.git merge 源repository b.git merge 目的repository 要merge的分支是master 1,git clone b.git git clone 2,設定upstream,upstream...

使用mmap函式實現兩個程序間讀寫通訊

有乙個程序負責寫內容到mmap對映的一塊快取區中,另乙個程序負責將這些內容讀取出來。1 mmap r ipc.c原始碼 include include include include include include include int main int argc,char ar while 1 ...

取得兩個間的Strings

在google上面看到的.也許有人有用.ff cccddd eee11 jkjl 1.print join map grep 會列印出 ff ccc ddd eee 11jkjl 2.不包含 print join map grep and and m 列印出ccc ddd eee 3.不包含 pri...