Linux有名管道(FIFO)的阻塞和非阻塞讀寫

2021-07-09 08:36:00 字數 1230 閱讀 3053

有名管道的讀寫有阻塞和非阻塞兩種,可以在open()時指定,下面我們對各種情況進行一些討論。

//寫程序

#include #include #include #include #include #include #define fifo_name "/tmp/myfifo"

main()

//以阻塞型只寫方式開啟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()

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

fd=open(fifo_name,o_rdonly);

if(fd==-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)

管道的緩衝區是有限的 管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小 管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息 或命令 或記錄 等等 多個寫程序,乙個讀程序。可以參考我之前的部落格 一旦設定了阻塞標誌,呼叫mkfif...

FIFO 有名管道

有名管道相關的關鍵概念 管道應用的乙個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中。這樣,即 使與fifo的建立程序不存在親...

21 有名管道fifo

1.特點 有名管道 在磁碟上有這樣乙個檔案,可通過命令ls l檢視字首帶p的檔案 偽檔案,在磁碟上大小永遠為0 在核心中有乙個對應的緩衝區 半雙工的通訊方式 預設阻塞 2.使用場景 沒有血緣關係的程序間通訊 3.建立方式 命令 mkfifo 管道名 函式 mkfifo 類似於mkdir 4.fifo...