1. 程式人生 > >Linux 程序間通訊方式 pipe()函式

Linux 程序間通訊方式 pipe()函式

Linux 程序間通訊方式有以下幾種:
1-》管道(pipe)和有名管道(fifo).
2-》訊息佇列
3-》共享記憶體
4-》訊號量
5-》訊號(signal)
6-》套接字(sicket)

在這裡我們看一下第一種====管道(pipe)。有名管道(fifo)見其它文章。

eg :我們以前學的命令 cat  file | grep  "abc"  > file2
在我看來 我們把cat 讀取file中的內容讀到記憶體在通過過濾命令grep 過濾出包含"abc"的記錄 再輸出重定向到檔案file2
在這個過程中 我們把cat  file | grep  "abc"的輸出內容作為 > 的輸入內容。

在Linux系統中,管道通訊可以通過使用系統呼叫來實現。
使用格式為:
#include<unistd.h>
int  pipe(int fd[2]);
功能: 建立一個簡單的管道,若成功則為陣列fd分配兩個檔案描述符,其中fd[0] 用於讀取管道,fd[1]用於寫入管道。
返回:成功返回0,失敗返回-1;

管道,顧名思義,當我們希望將兩個程序的資料連線起來的時候就可以使用它,從而將一個程序的輸出資料作為另一個程序的輸入資料達到

通訊交流的目的。
但值得我們注意的是:管道它有自身的特點。
 (1)管道通訊是單向的,並且遵守先進先出的原則,即先寫入的資料先讀出。
 (2)管道是一個無結構,無固定大小的位元組流。
 (3) 管道把一個程序的標準輸出和另一個程序的標準輸入連線在一起。資料讀出後就意味著從管道中移走了,消失了。其它的程序都不能   

           再讀到這些資料。就像我們平常見到的管子水流走了就沒有了。 這點很重要!!
  (4) pipe這種管道用於兩個有親緣關係的程序之間。eg:父子程序......

好了,廢話不多說了,下面我們看個例子:come on

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wait.h>
#include<sys/types.h>

int main(int argc ,char *argv[])
{
 int pipefd[2],result;
 char buf[1024];
 int flag=0;
 pid_t pid;
 result= pipe(pipefd);//建立一個管道
 if(result==-1){
  perror("pipe error:");
  exit(EXIT_FAILURE);
 }
 pid=fork();//建立一個子程序
 if(pid==-1)
 {
  perror("fork  error:");
  exit(EXIT_FAILURE);
 }
 else if(pid==0){
  if((close(pipefd[1]))==-1)//close write only read
  {
   perror("close write  error:");
   exit(EXIT_FAILURE);
  }
  while(1){ //迴圈讀取資料
   read(pipefd[0],buf,1024);//最多讀取1024個位元組
   printf("read from pipe :  %s\n",buf);
   if(strcmp(buf,"exit")==0){// if 讀取到的字串是exit 這是
                    //父程序會接受到一個終止程序的訊號,父程序會回收子程序的資                   // 源等
   exit(EXIT_SUCCESS);
   }   
  }    
 }else{
  //close read only write
  if((close(pipefd[0]))==-1){
   perror("close read error:");
   exit(EXIT_FAILURE);
  }
  while(1)//迴圈寫入內容
  {
   waitpid(pid,NULL,WNOHANG);//等待子程序退出
   if(flag==1)
    exit(0);
   scanf("%s",buf);
   write(pipefd[1],buf,strlen(buf)+1);//具體寫多少個位元組
   if(strcmp(buf,"exit")==0){
    flag=1;
    sleep(1);//讓子程序完全退出。
   }
  }

 }

 return 1;
}

此程式程式碼中都有註釋,在這裡就不廢話了。
執行結果為:

 

當我們鍵入exit時 父子程序都退出。
此時我們可以用ps -aux進行檢視。

相關推薦

Linux 程序通訊方式 pipe函式

Linux 程序間通訊方式有以下幾種: 1-》管道(pipe)和有名管道(fifo). 2-》訊息佇列 3-》共享記憶體 4-》訊號量 5-》訊號(signal) 6-》套接字(sicket) 在這裡我們看一下第一種====管道(pipe)。有名管道(fifo)見其它文章。

程序通訊方式總結windows 和linux

平時看的書很多,瞭解的也很多,但不喜歡總結,這不昨天面試的時候被問到了程序間通訊的方式,因為沒有認真總結過,所以昨天答得不是特別好。現在將linux和windows的程序間通訊方式好好總結一下。           windows的程序間的通訊方式有1.檔案對映;2. 共

Linux程序通訊之——管道整理

 程序間通訊 fork pipe pie_t 等用法(管道機制 通訊) 每個程序各自有不同的使用者地址空間,任 何一個程序的全域性變數在另一個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從

程序通訊方式總結適用初學者

前言:linux的程序間通訊概述 1、為什麼需要程序間通訊       (1)程序間通訊(IPC)指的是2個任意程序之間的通訊。       (2)同一個程序在一個地址空間中,所以同一個程序的不同模組(不同函式、不同檔案)之間都是很簡單的(很多時候都是全域性變數、也可以通

linux 程序通訊方式

1 無名管道通訊 無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2 高階管道通訊 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序

Linux程序通訊方式一:有名管道FIFO

有名管道 我們經常把FIFO稱為有名管道(命名管道)。使用它可以實現兩個不相干的程序之間的通訊。它雖然被稱之為檔案,但是管道檔案在磁碟上只有一個inode結點,這個ionde結點指向的是記憶體中的一塊區域,當A程序建立並使用有名管道時,直接把資料寫入記憶體中,而B程序也是直

Linux程序通訊方式--本地socket

先上一個程式碼 服務端: //s_unix.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #

linux 程序通訊方式總結

對linux 程序通訊的一點簡單總結,主要包括 管道通訊,還有 system v, posix 標準的 訊息佇列,訊號量,共享記憶體方式。 基於管道的通訊主要包括有名管道,和無名管道,所謂的有名管道,就是建立的時候會帶有具體的標識,以便於確認對誰操作,而無名管道是建立沒有名字的管道,

Linux程序通訊pipe

1、管道(PIPE)        從概念上說,管道是兩個程序之間的一個connection,因此一個程序的標準輸出就變成了另一個程序的標準輸入。在Unix作業系統中,管道用於程序間通訊(inter-process communication). (1

Linux程序通訊方式簡介

序 linux下的程序通訊手段基本上是從Unix平臺上的程序通訊手段繼承而來的。而對Unix發展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟體釋出中心)在程序間通訊方面的側重點有所不同。前者對Unix早期的程序間通訊手段進行了

Linux程序通訊方式

程序與程序通訊的概念 程序是作業系統的概念,每當我們執行一個程式時,對於作業系統來講就建立了一個程序,在這個過程中,伴隨著資源的分配和釋放。可以認為程序是一個程式的一次執行過程。 程序使用者空間是相互獨立的,一般而言是不能相互訪問的。但很多情況下程

Linux程序通訊IPC方式總結

程序間通訊概述 程序通訊的目的 資料傳輸  一個程序需要將它的資料傳送給另一個程序,傳送的資料量在一個位元組到幾M位元組之間 共享資料  多個程序想要操作共享資料,一個程序對共享資料 通知事件 一個程序需要向另一個或一組程序傳送訊息,通知它(它們)

Linux系統程式設計——程序通訊:管道pipe

管道的概述 管道也叫無名管道,它是是 UNIX 系統 IPC(程序間通訊) 的最古老形式,所有的 UNIX 系統都支援這種通訊機制。 無名管道有如下特點: 1、半雙工,資料在同一時刻只能在一個方向上流動。 2、資料只能從管道的一端寫入,從另一端讀出。

Linux Pipe 程序通訊,生產者消費者

PIPE是Linux下可以用來實現程序間通訊的一種手段,當我們呼叫pipe系統呼叫時,將會產生一對檔案描述符,fd[0]可以用來讀,fd[1]用來寫,fd[1]寫的資料將會在fd[0]中讀到,我們稱之為管道。程序之間可以依賴管道的方式實現程序間通訊,pipe是半

Linux程序通訊的幾種方式總結--linux核心剖析

程序間通訊概述 程序通訊的目的 資料傳輸 一個程序需要將它的資料傳送給另一個程序,傳送的資料量在一個位元組到幾M位元組之間 共享資料 多個程序想要操作共享資料,一個程序對共享資料 通知事 一個程序需要向另一個或一組程序傳送訊息,通知它(它

Linux 程序通訊訊號量

1 訊號量概述 訊號量和其他IPC不同,並沒有在程序之間傳送資料,訊號量用於多程序在存取共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。 程序間的互斥關係與同步關係存在的根源在於臨界資

Linux 程序通訊IPC的特性

1.識別符號和鍵 每個核心中的IPC結構(訊息佇列、訊號量或共享儲存段)都用一個非負整數的識別符號 (identifier)加以引用。 例如,要向一個訊息佇列傳送訊息或者從一個訊息佇列取訊息,只需要知道其佇列識別符號。 當一個IPC結構被建立,然後又被刪除時,與這種結構

Linux 程序通訊共享記憶體

可以說, 共享記憶體是一種最為高效的程序間通訊方式, 因為程序可以直接讀寫記憶體, 不需要任何資料的複製。 為了在多個程序間交換資訊, 核心專門留出了一塊記憶體區, 這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。 因此, 程序就可以直接讀寫這一記憶體區而不需要

linux程序通訊IPC小結

linux IPC型別 1、匿名管道 2、命名管道 3、訊號 4、訊息佇列 5、共享記憶體 6、訊號量 7、Socket 1、匿名管道 過程: 1、管道實質是一個核心緩衝區,先進先出(佇列)讀取緩衝區記憶體資料 2、一個數據只能讀一次,讀完後在緩衝區就不存在

程序通訊方式-----訊息佇列

訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別