使用命名管道的操作和使用普通的文字檔案類似,都是系統呼叫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);}
step 1: lishun@lishun-qt:~$ mkfifo -m 0666 fifo1 (建立管道)
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;
}
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...