Linux系統程式設計之程式間通訊方式:管道(一)

千鋒教育官方發表於2019-09-16


管道的概述

管道也叫無名管道,它是是 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章