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程式設計
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- linux 程式間通訊之管道Linux
- 系統程式設計——管道通訊程式設計
- Linux系統程式設計之程式間通訊方式:共享記憶體例項演示Linux程式設計記憶體
- Linux系統程式設計之匿名管道Linux程式設計
- Linux 的程式間通訊:管道Linux
- Linux程式間通訊②:有名管道FIFOLinux
- linux程式間通訊--管道(PIPE & FIFO)Linux
- 【linux】系統程式設計-1-程式、管道和訊號Linux程式設計
- Linux系統程式設計—有名管道Linux程式設計
- Linux作業系統 程式之間的通訊Linux作業系統
- 溫故之.NET程式間通訊——管道
- Linux系統程式設計之命名管道與共享記憶體Linux程式設計記憶體
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- linux 程式間通訊之FIFOLinux
- Linux程式之間如何通訊?Linux
- Linux 下的程式間通訊:使用管道和訊息佇列Linux佇列
- Linux環境程式設計程式間通訊機制理解Linux程式設計
- Linux系統程式設計之程式介紹Linux程式設計
- linux環境程式設計(2): 使用pipe完成程式間通訊Linux程式設計
- 程式間通訊——LINUXLinux
- Linux程式間通訊Linux
- Linux系統程式設計——特殊程式之孤兒程式Linux程式設計
- 【Linux系統程式設計】Linux訊號列表Linux程式設計
- Linux系統程式設計:訊號捕捉Linux程式設計
- Linux系統程式設計—訊號捕捉Linux程式設計
- linux環境程式設計(3): 使用POSIX IPC完成程式間通訊Linux程式設計
- 20.2、python程式間通訊——佇列和管道Python佇列
- Linux程式間的通訊方式有哪些?Linux入門教程Linux
- Linux 程式間通訊之System V 訊號量Linux
- 程式間通訊方式有哪些?
- Linux程式間通訊-eventfdLinux
- Linux程式間通訊之共享記憶體Linux記憶體
- Linux系統程式設計之訊號中斷處理(下)Linux程式設計