1. 程式人生 > >Linux -- 程序間通訊之管道

Linux -- 程序間通訊之管道

管道是Linux裡的一種檔案型別,同時也是Linux系統下程序間通訊的一種方式

建立一個管道檔案有兩種方式:

1.  Shell 下命令 mkfifo + filename,即建立一個有名管道

2.  C語言裡呼叫 pipe( ) 函式,建立一個無名管道

有名管道 / 無名管道 

區別:

1.  有名管道在程式外部使用 mkfifo 命令生成,無名管道在程式內部呼叫 pipe( ) 函式建立;

2.  顧名思義,有名管道有檔名,無名管道沒有檔名;

3.  有名管道生成後直到刪除都存在,無名管道在程式退出時則生命週期結束;

4.  有名管道可以在任意兩個程序間傳輸資料,無名管道只能在父子程序間傳輸資料;

*有名/無名管道都是半雙工

(只能從一端向另一端傳送資料,輸入端與輸出端在開啟管道時是固定的)

管道檔案的特性:

1.  開啟管道必須有兩端(兩個程序)同時開啟一個管道,分別為讀(r)和寫(w);讀取端負責從管道中讀取資料,寫入端負責向管道中輸入資料;

2.  當讀端關閉,寫端會收到訊號,終止程式;當寫端關閉,讀端不再進入阻塞;

3.  管道檔案的大小始終為0,開啟管道檔案時,在記憶體中為其分配空間,管道關閉後資料消失;Linux預設PIPE_SIZE(一個管道最大儲存大小)為64k,PIPE_BUF(管道緩衝區)為4k;當對管道進行 write 操作時,若此時有多個程序同時寫入一個管道,且寫入的位元組大小超過PIPE_BUF,則寫操作的資料有可能相互穿插。


管道檔案的記憶體空間有兩個指標 head / tail ,head指標隨讀取資料向後移動,tail指標隨寫入資料向後移動,當指標到檔案尾時,會造成讀阻塞 (讀取結束)/ 寫阻塞(空間已滿)

*注意*

當我們呼叫 pipe( ) 建立無名管道後 fork( ) 以實現父子程序間通訊,此時 pipe( ) 生成的兩個 r / w 描述符引用都會加一,在父子程序中同時存在 r / w 兩個描述符,此時應當在父子程序中分別 close 不用的描述符,使 r / w 端只存在一個引用,這樣父子程序間通訊時可以正常讀寫響應。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

int main()
{	
	char buff[128] = {0};
	pid_t pid;
	int pipefd[2];
	pipe(pipefd);					// creat & open a fifo file

	pid = fork();
	if(pid == -1)
	{
		printf("fork error\n");
		exit(0);
	}
	else if(pid == 0)				// chid process
	{
		close(pipefd[1]);			// close 'w' 
		
		if( read(pipefd[0],buff,128) <= 0)
		{
			printf("read error\n");
			exit(0);
		}
		printf("child : %s\n",buff);
	}
	else						// parent process
	{
		close(pipefd[0]);			// close 'r' fd
		
		printf("input: ");
		fflush(stdout);
		gets(buff);
		if( write(pipefd[1],buff,127) <= 0)
		{
			printf("write error\n");
			exit(0);
		}
	}
	
	close(pipefd[0]);
	close(pipefd[1]);
	
	exit(0);
}


相關推薦

Linux程序通訊——管道(整理)

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

Linux -- 程序通訊管道

管道是Linux裡的一種檔案型別,同時也是Linux系統下程序間通訊的一種方式 建立一個管道檔案有兩種方式: 1.  Shell 下命令 mkfifo + filename,即建立一個有名管道 2.

Linux 程序通訊管道

程序之間的通訊之管道 目錄 1 無名管道    管道是一種最基本的IPC機制,作用於父子程序之間,完成資料傳遞。 管道有以下特性: 1.其本質是一個偽檔案(實為核心緩衝區)其本質是一個偽檔案(實為核心緩衝區) 2.由兩

Linux程序通訊管道通訊詳解

        在學習程序的時候,我們瞭解到了程序的獨立性:程序之間是相互獨立的,每個程序有自己的虛擬地址空間,並且虛擬地址空間通過頁表的對映,對映到屬於自己的實體記憶體上。並且各個程序之間互相不影響,執行自己的程式碼。    

Linux下的程序通訊管道

在Linux下,每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都看不到所以進 程之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通

linux 程序通訊FIFO

1.概述 FIFO與管道幾乎類似,所以FIFO也是一個位元組流,從FIFO讀取的順序也是與被寫入FIFO的順序一致,容量是也有限的,也是可以確保寫入不超過PIPE_BUF位元組的操作是原子的,FIFO的本質也是一個管道,但傳遞方向是可以雙向的,它們兩者之間的最大差別在於FIFO在檔案系統中擁有一個名稱,並且

程序通訊管道--pipe和fifo使用

匿名管道pipe 函式原型: #include <unistd.h> int pipe(int fildes[2]); 引數說明 fildes是我們傳入的陣列,也是一個傳出引數。fildes[0]是讀端,fildes[1]是寫端。 返回值 成功呼叫返回0。 失敗呼叫返回-1且

Linux程序通訊——01管道

程序間通訊: 對於每個程序來說,都有一份屬於它自己的記憶體資源,並且獨佔這份記憶體資源。而程序間通訊的目的就是讓不同的程序間能看到一份公共的資源。所有交換的資料必須通過核心來傳遞,在核心中開闢一塊緩衝區,通過這塊緩衝區來實現資料的傳遞,核心提供的這種機制稱為程序間通訊。

LinuxLinux程序通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

Linux程序通訊訊號通訊

訊號通訊是Linux程序間通訊的一種方式。 1.什麼是訊號? 訊號是系統響應某些條件而產生的一個事件,接收到該訊號的程序會相應地採取一些措施。例如我們在windows系統中想強制結束一個程式我們需要用到的是工作管理員,而在Linux中,我們是通過訊號來實現的,執

程序通訊管道通訊(PIPE匿名管道)

#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int

Linux程序通訊pipe

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

Linux程序通訊POSIX訊息佇列

訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。

linux 程序通訊訊號

Linux訊號(signal) 機制分析 轉載至:https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html 【摘要】本文分析了Linux核心對於訊號的實現機制和應

Linux程序通訊POSIX共享記憶體

共享記憶體是最高效的IPC機制,因為它不涉及程序之間的任何資料傳輸。這種高效率帶來的問題是,我們必須用其他輔助手段來同步程序對共享記憶體的訪問,否則會產生競態條件。因此,共享記憶體通常和其他程序間通訊方式一起使用。 Linux下有三種共享記憶體的IPC技術:S

Linux程序通訊訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)

System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和

linux程序通訊訊號量(semaphore)

==================================================== 訊號量(semaphore)簡介 當我們在多使用者系統,多程序系統,或是兩者混合的系統中使用執行緒操作編寫程式時,我們經常會發現我們有段臨界程式碼,在此處我們需要

程序通訊管道

何為程序間通訊 每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都是看不到的。所以程序之間如果要交換資料就必須通過核心。 在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間

程序通訊Linux C管道程式設計

管道簡述 管道(pipe)是Unix/Linux中最常見的程序間通訊方式之一,它在兩個程序之間實現一個數據流通的通道,資料以一種資料流的方式在程序間流動。在系統中,管道相當於檔案系統上的一個檔案,用於快取所要傳輸的資料。在某些特性上又不同於檔案,例如當資料讀出後,管道中就沒有資料了,但檔案沒

Linux高階程式設計基礎——程序通訊匿名管道

程序間通訊之匿名管道 利用匿名管道實現父子程序間通訊,要求 父程序傳送字串“hello child”給子程序; 子程序收到父程序傳送的資料後,給父程序回覆“hello farther”; 父子程序通訊完畢,父程序依次列印子程序的退出狀態以及子程序的pid。