Linux程序間通訊 無名管道和命名管道

2021-07-09 16:13:32 字數 3054 閱讀 6405

管道是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程序間的通訊 無名管道

注意 學習程序間的通訊重點在每種通訊方式所適用的場景和其使用方法。乙個程序在管道的尾部寫入資料,另乙個程序從管道的頭部讀出資料。管道包括無名管道和有名管道兩種,前者只能用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。管道通訊是單向的,有固定的讀端和寫端 資料被程序從管道...