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