Linux 程序間通訊(管道及有名管道FIFO)

2021-07-10 09:27:09 字數 2412 閱讀 3092

一. 管道:

1.只能用於具有親緣關係的程序之間的通訊  

2.半雙工通訊模式

3.一種特殊的檔案,是一種只存在於核心中的讀寫函式

管道基於檔案描述符,管道建立時,有兩個檔案描述符:

a. fd[0]: 固定用於讀管道

b. fd[1]: 固定用於寫管道

建立管道:pipe()

一般步驟:1. pipe()建立管道  2. fork()建立子程序  3. 子程序會繼承父程序的管道

關閉管道:1. 逐個關閉檔案描述符  2. close()

eg. 父子程序間的管道通訊:父子程序對管道分別有自己的讀寫通道,把無關的讀端或寫段關閉。

#include #include #include #include #include #define max_data_len 256

#define delay_time 1

int main()

if ((pid=fork())<0) else if (pid==0)

close(pipe_fd[0]);

exit(0);

} else

close(pipe_fd[1]);

waitpid(pid,null,0);

exit(0);}}

二. 有名管道fifo

1. 使不相關的兩個程序彼此通訊:a. 通過路徑名指出,在檔案系統中可見  

b. 管道建立後,兩程序可按普通檔案一樣對其操作

2. fifo遵循先進先出規則:a. 對管道讀從開始處返回資料

b. 對管道寫則把資料新增到末尾

c. 不支援如lseek()等檔案定位操作

建立有名管道:mkfifo()

建立管道成功後,可使用open()、read()和write()等函式。

為讀而開啟的管道可在open()中設定o_rdonly

為寫而開啟的管道可在open()中設定o_wronly

與普通檔案不同的是阻塞問題

•普通檔案的讀寫時不會出現阻塞問題

•在管道的讀寫中卻有阻塞的可能,

•非阻塞標誌:在open()函式中設定為o_nonblock l

阻塞開啟與非阻塞開啟

對於讀程序

•若該管道是阻塞開啟,且當前fifo內沒有資料,則對讀程序而言將一直阻塞到有資料寫入

•若該管道是非阻塞開啟,則不論fifo內是否有資料,讀程序都會立即執行讀操作。即如果fifo內沒有資料,則讀函式將立刻返回0

對於寫程序

•若該管道是阻塞開啟,則寫操作將一直阻塞到資料可以被寫入

•若該管道是非阻塞開啟而不能寫入全部資料,則讀操作進行部分寫入或者呼叫失敗

eg. 寫fifo與讀fifo

#include #include #include #include #include #include #include #include #define fifo "myfifo"

#define buff_size 1024

int main(int argc,char* argv)

sscanf(argv[1],"%s",buff);

% 測試fifo是否存在,若不存在,mkfifo乙個fifo

if(access(fifo,f_ok)==-1)

}% 呼叫open以只寫方式開啟fifo,返回檔案描述符fd

if((fd=open(fifo,o_wronly))==-1)

% 呼叫write將buff寫到檔案描述符fd指向的fifo中

if ((real_write=write(fd,buff,buff_size))>0)

close(fd);

exit(0);

}

#include #include #include #include #include #include #include #include #define fifo "myfifo"

#define buff_size 1024

int main()

}%以唯讀方式開啟fifo,返回檔案描述符fd

if((fd=open(fifo,o_rdonly))==-1)

% 呼叫read將fd指向的fifo的內容,讀到buff中,並列印

while(1)

}close(fd);

exit(0);

}

Linux程序間通訊 管道(有名管道

時隔很久,再來更博.今天主要寫的是linux中程序間通訊,程序間進行通訊的目的就是多個程序之間資料互相交換。程序間通訊方式有以下幾種 1 訊號 2 管道 分為有名管道和無名管道 3 訊號量 4 訊息佇列 5 共享儲存 共享記憶體 6 套接字 socket 其中套接字屬於多機通訊 全雙工通訊 其餘的屬...

程序間通訊 管道(有名管道)

前幾天我們簡單的介紹了程序間通訊的一種渠道 管道,我們有說道管道的概念,管道的通訊原理,還提到了管道的兩種型別 有名管道和無名管道,今天我們就來說說有名管道吧 基本概念 有名管道在檔案目錄中有乙個檔案標示 管道檔案 實際不佔據磁碟空間。資料快取在記憶體上 只有使用時記憶體才開闢,由於在記憶體上,因此...

程序間通訊(管道和有名管道)

管道 pipe 是兩個程序之間進行單向通訊的機制,因為它的單向性,所以又稱為半雙工管道。它主要用於程序間的一些簡單通訊。資料只能由乙個程序流向另乙個程序 乙個寫管道,乙個讀管道 如果要進行全雙工通訊,需要建立兩個管道。管道只能用於父子程序或者兄弟程序之間的通訊。管道沒有名字,且其緩衝區大小有限。乙個...