Linux系統是一種支援多任務並發執行的作業系統,它可以同時運行多個進程,從而提高系統的使用率和效率。但是,如果這些進程之間需要進行資料交換和協作,就需要使用一些進程間通訊(IPC)的方式,例如訊號、訊息佇列、共享記憶體、信號量等。其中,有名管道(FIFO)是一種比較簡單而強大的IPC方式,它可以讓兩個或多個進程透過一個檔案來進行資料傳輸,而無需關心檔案的內容和格式。本文將介紹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
}
先運行寫入進程(被阻塞),再運行讀取進程,一切正常。
先運行讀取進程(被阻塞),再運行寫入進程,一切正常。
就改一句程式碼 fd=open(FIFO_NAME,O_RDONLY | O_NONBLOCK),下面類似。
先運行寫入進程(被阻塞),再運行讀取進程,一切正常。
先運行讀取進程,程式直接崩掉(Segmentation fault (core dumped)),想想也挺自然的,沒東西你還要讀,而且不願等。
先運行寫進程,open呼叫將回傳-1,開啟失敗。
先運行讀取進程(被阻塞),再運行寫入進程,一切正常。
其實就是上面2,3類各取一半不正常的狀況。
還有我們在/tmp目錄下透過ls -la指令可以看到管道檔案myfifo的大小總是0,這是因為雖然FIFO檔案存在於檔案系統中,但FIFO中的內容都存放在記憶體中,所以檔案大小始終為0。
本文介紹了Linux系統中有名管道(FIFO)的阻塞和非阻塞讀寫的方法,包括有名管道的建立、開啟、讀寫、關閉和刪除等面向。透過了解和掌握這些知識,我們可以更好地使用有名管道(FIFO)來實現進程間通信,提高系統的效能和可靠性。當然,Linux系統中有名管道(FIFO)還有很多其他的特性和用法,需要我們不斷學習和探索。希望本文能帶給你一些啟發和幫助。
以上是Linux有名管道(FIFO):一種簡單而強大的進程間通訊方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!