程序間通訊2管道

2021-10-19 10:19:16 字數 2142 閱讀 2230

#include

#include

#include

/*1.一般來說子程序和父程序通訊至少需要兩條管道 一條用於讀,一條用於寫*/

/*2.兩個程序得共享資源都不是同乙個,一般來說子程序產生得時候會將所有得資源拷貝乙份供子程序使用,

所以父程序和子程序得資源不是同乙份*/

/*3.如果寫端的管道關閉之後,那麼讀端的就不會阻塞了,就會繼續執行下面的***/

/*4.如果讀端的管道關閉之後,那麼寫端的管道會產生訊號sigpipe*/

intmain

(void

) pd =

fork()

;//建立子程序

if(pd ==-1

)else

if(pd ==0)

//子程序建立成功

else

//父程序執行得**

if(pd >0)

//父程序等待子程序

return0;

}

demo將管道作為標準輸入輸出

#include

#include

#include

#include

intmain

(void

) pd =

fork()

;if(pd ==-1

)else

if(pd ==0)

//這時子程序裡有兩條管道分別是讀端和寫端

else

return0;

}

od.exe

#include

#include

intmain

(void);

ret =

scanf

("%s"

, buff)

;printf

("[ret: %d]buff=%s\n"

, ret, buff)

; ret =

scanf

("%s"

, buff)

;//這裡第二次讀取輸入時會失敗

printf

("[ret: %d]buff=%s\n"

, ret, buff)

;return0;

}

linux一切皆檔案 使用popen/pclose

popen的作用:

用來在兩個程式之間傳遞資料:

在程式a中使用popen呼叫程式b時,有兩種用法:

程式a讀取程式b的輸出(使用fread讀取)

程式a傳送資料給程式b,以作為程式b的標準輸入。(使用fwrite寫入)

用法:man popen

返回值:成功,返回file*

失敗, 返回空

#include

#include

#define buff_size 1024

intmain

(void

) cnt =

fread

(buff,

sizeof

(char

), buff_size, file)

;//讀到buff

if(cnt >0)

pclose

(file)

;//關閉這個檔案

return0;

}

在這個程式將字元寫到另一程式

#include

#include

#include

#define buff_size 1024

intmain

(void

)strcpy

(buff,

"hello world!");

cnt =

fwrite

(buff,

sizeof

(char),

strlen

(buff)

, file)

;//寫到p2的程式

pclose

(file)

;return0;

}

程序間通訊(2) 管道

管道 本質 核心的快取 管道分類 管道是程序間通訊中最古老的方式,它是指用於連線乙個讀程序和乙個寫程序以實現他們之間通訊的乙個共享檔案。我們將乙個程序到另乙個程序的資料流,稱之為 管道 它包括匿名管道和命名管道兩種。匿名管道 include h 功能 建立乙個無名管道 原型 int pipe int...

程序間通訊(2) 管道

管道 半雙工通訊 資料流向是單向的 先進先出的。只能乙個程序讀 乙個程序寫。資料從管道中讀出後,就會被刪除。如果管道中沒有資料,讀操作就會被阻塞,直到管道中有資料可讀 而如果管道的滿的,寫操作就會被阻塞,直到管道中有足夠大的空間可用。有名管道 fifo 在任意兩個程序間通訊。有屬性資訊 inode結...

程序間通訊(2) 命名管道

命名管道的應用,正是為了克服匿名管道存在的這些缺陷。命名管道可以在沒有親緣關係的程序中應用,甚至在不同計算上的兩個程序也可以通過命名管道實現通訊,這是因為命名管道實際上是windows在網路介面上封裝的程序間通訊形式。命名管道可以實現一對多的通訊,同時也能實現雙向讀寫通訊。結合例子進行講解,例程如下...