Linux系統程式設計之程式間通訊方式:管道(一)
管道的概述
管道也叫無名管道,它是是 UNIX 系統 IPC(程式間通訊) 的最古老形式,所有的 UNIX 系統都支援這種通訊機制。
無名管道有如下特點:
1、半雙工,資料在同一時刻只能在一個方向上流動。
2、資料只能從管道的一端寫入,從另一端讀出。
3、寫入管道中的資料遵循先入先出的規則。
4、管道所傳送的資料是無格式的,這要求管道的讀出方與寫入方必須事先約定好資料的格式,如多少位元組算一個訊息等。
5、管道不是普通的檔案,不屬於某個檔案系統,其只存在於記憶體中。
6、管道在記憶體中對應一個緩衝區。不同的系統其大小不一定相同。
7、從管道讀資料是一次性操作,資料一旦被讀走,它就從管道中被拋棄,釋放空間以便寫更多的資料。
8、管道沒有名字,只能在具有公共祖先的程式(父程式與子程式,或者兩個兄弟程式,具有親緣關係)之間使用。
對於無名管道特點的理解,我們可以類比現實生活中管子,管子的一端塞東西,管子的另一端取東西。
無名管道是一種特殊型別的檔案,在應用層體現為兩個開啟的檔案描述符。
管道的操作
所需標頭檔案:
#include <unistd.h>
int pipe(int filedes[2]);
功能:建立無名管道。
引數:
filedes: 為 int 型陣列的首地址,其存放了管道的檔案描述符 filedes[0]、filedes[1]
當一個管道建立時,它會建立兩個檔案描述符 fd[0] 和 fd[1]。其中 fd[0] 固定用於讀管道,而 fd[1] 固定用於寫管道。一般檔案 I/O 的函式都可以用來操作管道( lseek() 除外)。
返回值:成功:0 失敗:-1
下面我們寫這個一個例子,子程式透過無名管道給父程式傳遞一個字串資料:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int fd_pipe[2] = {0};
pid_t pid;
if( pipe(fd_pipe) < 0 ){// 建立無名管道
perror("pipe");
}
pid = fork(); // 建立程式
if( pid < 0 ){ // 出錯
perror("fork");
exit(-1);
}
if( pid == 0 ){ // 子程式
char buf[] = "I am sunplus";
// 往管道寫端寫資料
write(fd_pipe[1], buf, strlen(buf));
_exit(0);
}else if( pid > 0){// 父程式
wait(NULL); // 等待子程式結束,回收其資源
char str[50] = {0};
// 從管理裡讀資料
read(fd_pipe[0], str, sizeof(str));
printf("str=[%s]\n", str); // 列印資料
}
return 0;
}
執行結果:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657102/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux系統程式設計之程式間通訊方式:命名管道(一)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:命名管道(二)Linux程式設計
- LLinux系統程式設計(10)——程式間通訊之管道Linux程式設計
- Linux系統程式設計(11)——程式間通訊之有名管道Linux程式設計
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- 系統程式設計——管道通訊程式設計
- linux 程式間通訊之管道Linux
- linux系統程式設計之管道(一):匿名管道(pipe)Linux程式設計
- 程式間通訊(一)管道
- Linux系統程式設計之程式間通訊方式:共享記憶體例項演示Linux程式設計記憶體
- Linux 的程式間通訊:管道Linux
- Linux系統程式設計之匿名管道Linux程式設計
- linux系統程式設計之管道(三):命令管道(FIFO)Linux程式設計
- linux程式間通訊--管道(PIPE & FIFO)Linux
- Linux程式間通訊②:有名管道FIFOLinux
- 【linux】系統程式設計-1-程式、管道和訊號Linux程式設計
- 溫故之.NET程式間通訊——管道
- linux系統程式設計之管道(二):管道讀寫規則Linux程式設計
- PHP多程式程式設計(2):管道通訊PHP程式設計
- Linux系統程式設計—有名管道Linux程式設計
- Linux程式執行緒學習筆記:程式間通訊 之 管道Linux執行緒筆記
- Linux作業系統 程式之間的通訊Linux作業系統
- linux程式間通訊-----管道總結例項Linux
- “Linux程式設計”小結(程式間通訊)Linux程式設計
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- 作業系統程式之間的通訊作業系統
- linux系統程式設計之程式(一):程式與程式Linux程式設計
- Unix系統下程式間通訊方式及比較
- linux 程式間通訊之FIFOLinux
- Linux程式之間如何通訊?Linux
- Linux系統程式設計之命名管道與共享記憶體Linux程式設計記憶體
- 【IPC程式間通訊之二】管道PipeC程式
- linux系統程式設計之訊號(一):中斷與訊號Linux程式設計
- Linux 下的程式間通訊:使用管道和訊息佇列Linux佇列
- Linux環境程式設計程式間通訊機制理解Linux程式設計
- 程式間通訊方式有哪些?