管道是linux程序間通訊的一種方式,如命令ps -ef | grep ntp
無名管道的特點:
1、只能在親緣關係程序間通訊(父子或兄弟)
2、半雙工(固定的讀端和固定的寫端)
3、是特殊的檔案,可以用read、write等,只能在記憶體中
管道函式原型:
#include
intpipe(int fds[2]);
函式pipe
用於建立乙個無名管道,如果成功,fds[0]存放可讀的檔案描述符,fds[1]存放可寫檔案描述符,並且函式返回0,否則返回-1。
通過呼叫pipe獲取這對開啟的檔案描述符後,乙個程序就可以從fds[0]中讀資料,而另乙個程序就可以往fds[1]中寫資料。當然兩程序間必須有繼承關係,才能繼承這對開啟的檔案描述符。
管道不像真正的物理檔案,不是持久的,即兩程序終止後,管道也自動消失了。
#include
#include
#include
int main()
; pipe(fds);
char szbuf[32] = ;
if(fork() == 0) //表示子程序
else
return
0;}
執行結果:
hello
管道兩端的關閉是有先後順序的,如果先關閉寫端則從另一端讀資料時,read函式將返回0,表示管道已經關閉;
但是如果先關閉讀端,則從另一端寫資料時,將會使寫資料的程序接收到sigpipe
(發出乙個sigpipe訊號給程序,告訴程序這個連線已經斷開)訊號,如果寫程序不對該訊號進行處理,將導致寫程序終止,如果寫程序處理了該訊號,則寫資料的write函式返回乙個負值,表示管道已經關閉。
無名管道只能在親緣關係的程序間通訊大大限制了管道的使用,有名管道突破了這個限制,通過指定路徑名的正規化實現不相關程序間的通訊
建立fifo檔案的函式原型:
#include
#include
int mkfifo(const
char *pathname, mode_t mode);
返回值:建立成功,則返回0,否則-1。
pathname
為要建立的fifo檔案的全路徑名
mode
為檔案訪問許可權
建立管道檔案**:
#include
#include
int main(int argc, char *argv)
if(mkfifo(argv[1], 0666) == -1)
return0;}
yu@ubuntu
:~/0126/fifo$ gcc -o fifo fifo.c
yu@ubuntu
:~/0126/fifo$ ./fifo newfile
yu@ubuntu
:~/0126/fifo$ ls
fifo fifo.c newfile
yu@ubuntu
:~/0126/fifo$ ls -l
total 12
-rwxrwxr-x 1 yu yu 7404
jan2604:
18 fifo
-rw-rw-r-- 1 yu yu 233
jan2604:
18 fifo.c
prw-rw-r-- 1 yu yu 0
jan2604:
18 newfile
刪除fifo檔案的函式原#include
#include
int main()
yu@ubuntu
:~/0126/fifo$ gcc -o delfifo delfifo.c
yu@ubuntu
:~/0126/fifo$ ls
delfifo delfifo.c fifo fifo.c newfile
yu@ubuntu
:~/0126/fifo$ ./delfifo
yu@ubuntu
:~/0126/fifo$ ls
delfifo delfifo.c fifo fifo.c
注意:用命令mkfifo建立,不能重複建立,用命令unlink刪除
非親緣兩程序間通過fifo通訊實戰
1、執行mkfifo myfifo
建立命名管道fifo檔案myfifo
2、write.c
#include
#include
#include
#include
int main()
gcc -o write
write.c
生成write
3、read.c
#include
#include
#include
#include
#define bufsize 128
int main()
close(fdfifo);
return
0;}
gcc -o read
read.c
生成read
4、此時執行./read
,進入阻塞狀態
5、另開乙個終端,執行./write
read
執行成功,螢幕輸出hello
程序間通訊 無名管道
在上次的部落格中,我給大家介紹了程序間通訊的方式 有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊 無名管道。有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。無名管道因其使...
程序間通訊 無名管道
1.無名管道 pipe 2.有名管道 fifo 3.訊號 signal 4.共享記憶體 share memory 5.訊息佇列 message queue 6.訊號燈集 semaphore set 7.套接字 1.只能用於具有親緣關係的程序之間的通訊 父子或兄弟程序 2.彈弓的通訊模式,具有固定的讀...
linux程序間的通訊 無名管道
注意 學習程序間的通訊重點在每種通訊方式所適用的場景和其使用方法。乙個程序在管道的尾部寫入資料,另乙個程序從管道的頭部讀出資料。管道包括無名管道和有名管道兩種,前者只能用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。管道通訊是單向的,有固定的讀端和寫端 資料被程序從管道...