有名管道的讀寫有阻塞和非阻塞兩種,可以在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...