2021-05-12 14:32:11
Linux進程間通訊之管道簡述
2020-06-16 16:55:16
這篇文章我們將介紹Linux間進程通間信中的有名管道與無名管道。
一.無名管道
無名管道是一種特殊型別的檔案,在核心中對應的資源即一段特殊記憶體空間,這段空間完全由作業系統管理和維護。可以使用read/write等函數進行讀寫操作,但不能使用lseek函數來修改當前的讀寫位置,因為管道需要滿足FIFO的原則。
讀寫無名管道:
讀寫管道使用的系統呼叫就是read和write,兩者都預設以阻塞方式讀寫管道,如果要修改這兩個函數的行為,可以使用fcntl函數實現。
讀寫特點:
利用無名管道實現子進程傳送資料,父進程接收資料:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int filedes[2];
char buf[10] = {0};
pipe(filedes);
printf("Please input your string: n");
if(fork() == 0)
{
close(filedes[0]);
while(1){
fgets(buf, 10, stdin);
int ret = write(filedes[1], buf, strlen(buf));
if(ret < 0)
break;
}
}
else
{
close(filedes[1]);
while(1){
int ret = read(filedes[0], buf, sizeof(buf));
if(ret < 0)
break;
printf("The msg that you input is : %sn", buf);
printf("Please input your string: n");
memset(buf, 0, sizeof(buf));
}
}
return 0;
}
二.有名管道
有名管道FIFO依賴於檔案系統,是一個存在的特殊檔案,因此,FIFO可以在同主機任意進程間實現通訊。
有名管道雖然和普通檔案一樣具有磁碟存放路徑、檔案許可權和其他屬性;但是,它和普通檔案又有區別,有名管道並沒有在磁碟中存放真正的資訊,它儲存的通訊資訊在記憶體中,兩個進程結束後自動丟失,擁有的一個磁碟路徑僅僅是一個介面,其目的是使用進程間資訊的程式設計更簡單統一。通訊的兩個進程結束後,它的檔案路徑本身仍然存在,這是和無名管道不一樣的地方。
讀寫有名管道:
通過write和read來操作有名管道前,需要呼叫open()函數開啟該檔案,另外,操作有名管道的阻塞位置為open位置,而不是無名管道的讀寫位置。
讀寫特點:
單進程讀寫有名管道:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FIFO_MODE 00600
#define FD_FLAG O_RDWR
int main(int argc, char** argv)
{
char buf[] = "Lance#";
char RecvBuf[20] = {0};
unlink(argv[1]);
mkfifo(argv[1], FIFO_MODE);
int fd = open(argv[1], FD_FLAG);
write(fd, buf, sizeof(buf));
read(fd, RecvBuf, sizeof(buf));
puts(RecvBuf);
return 0;
}
執行結果:
管道基本特點總結:
本文永久更新連結地址:http://www.linuxidc.com/Linux/2018-02/150774.htm
相關文章