首頁  >  文章  >  系統教程  >  Linux有名管道(FIFO):一種簡單而強大的進程間通訊方式

Linux有名管道(FIFO):一種簡單而強大的進程間通訊方式

WBOY
WBOY轉載
2024-02-11 21:36:18785瀏覽

Linux系統是一種支援多任務並發執行的作業系統,它可以同時運行多個進程,從而提高系統的使用率和效率。但是,如果這些進程之間需要進行資料交換和協作,就需要使用一些進程間通訊(IPC)的方式,例如訊號、訊息佇列、共享記憶體、信號量等。其中,有名管道(FIFO)是一種比較簡單而強大的IPC方式,它可以讓兩個或多個進程透過一個檔案來進行資料傳輸,而無需關心檔案的內容和格式。本文將介紹Linux系統中有名管道(FIFO)的阻塞和非阻塞讀寫的方法,包括有名管道的建立、開啟、讀寫、關閉和刪除等面向。

Linux有名管道(FIFO):一種簡單而強大的進程間通訊方式

#//寫入進程

##include

##include

##include

##include

##include

##include

##define FIFO_NAME “/tmp/myfifo”

main()

{

int fd;

char w_buf[50];

int w_num;

// 若fifo已存在,則直接使用,否則建立它

if((mkfifo(FIFO_NAME,0777)

{

printf(“cannot create fifo…\n”);

exit(1);

}

//以阻塞型只寫方式開啟fifo

#fd=open(FIFO_NAME,O_WRONLY);

w_num=write(fd,”abcdg\0″,6);

printf(“%d\n”,w_num);

}

//讀取進程

##include

##include

##include

##include

##define FIFO_NAME “/tmp/myfifo”

main()

{

char r_buf[50];

int fd;

int r_num;

// 若fifo已存在,則直接使用,否則建立它

if((mkfifo(FIFO_NAME,0777)

{

printf(“cannot create fifo…\n”);

exit(1);

}

//以阻塞型唯讀方式開啟fifo

#fd=open(FIFO_NAME,O_RDONLY);

if(fd==-1)

{

printf(“open %s for read error\n”);

exit(1);

}

// 透過鍵盤輸入字串,再寫入fifo,直到輸入」exit」為止

r_num=read(fd,r_buf,6);

printf(” %d bytes read:%s\n”,r_num,r_buf);

unlink(FIFO_NAME);//刪除fifo

}

1.寫入進程阻塞,讀取進程阻塞。

先運行寫入進程(被阻塞),再運行讀取進程,一切正常。

先運行讀取進程(被阻塞),再運行寫入進程,一切正常。

2.寫入進程阻塞,讀取進程非阻塞。

就改一句程式碼 fd=open(FIFO_NAME,O_RDONLY | O_NONBLOCK),下面類似。

先運行寫入進程(被阻塞),再運行讀取進程,一切正常。

先運行讀取進程,程式直接崩掉(Segmentation fault (core dumped)),想想也挺自然的,沒東西你還要讀,而且不願等。

3.寫入進程非阻塞,讀取進程阻塞。

先運行寫進程,open呼叫將回傳-1,開啟失敗。

先運行讀取進程(被阻塞),再運行寫入進程,一切正常。

4.寫入進程非阻塞,讀取進程非阻塞。

其實就是上面2,3類各取一半不正常的狀況。

還有我們在/tmp目錄下透過ls -la指令可以看到管道檔案myfifo的大小總是0,這是因為雖然FIFO檔案存在於檔案系統中,但FIFO中的內容都存放在記憶體中,所以檔案大小始終為0。

本文介紹了Linux系統中有名管道(FIFO)的阻塞和非阻塞讀寫的方法,包括有名管道的建立、開啟、讀寫、關閉和刪除等面向。透過了解和掌握這些知識,我們可以更好地使用有名管道(FIFO)來實現進程間通信,提高系統的效能和可靠性。當然,Linux系統中有名管道(FIFO)還有很多其他的特性和用法,需要我們不斷學習和探索。希望本文能帶給你一些啟發和幫助。

以上是Linux有名管道(FIFO):一種簡單而強大的進程間通訊方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:lxlinux.net。如有侵權,請聯絡admin@php.cn刪除