匿名管道實現父子程序之間的通訊

2021-08-26 10:49:01 字數 1659 閱讀 4307

/*匿名管道: 匿名管道可以實現父子程序的通訊, 乙個由另乙個程序呼叫createprocess函式建立的程序稱為子程序

我們在利用createpipe建立你民管道的時候會獲得管道的讀寫控制代碼 子程序可以繼承這個控制代碼

在父程序通過 createpipe函式獲得控制代碼可以對匿名管道進行讀寫操作

在子程序 通過getstdhandle()通過不同的引數 可以獲得標準 輸入 輸出 錯誤的 控制代碼 這些控制代碼對子程序來說都是從父程序繼承過來的所以我們在

子程序也可以對匿名進行讀寫 這就實現了父子程序之間的通訊

*/#include

#include "windows.h"

using namespace std ;

void main()

;sa.binherithandle=true ;

sa.lpsecuritydescriptor=null ;

sa.nlength=sizeof(security_attributes);

::createpipe(&hread, //返回管讀取控制代碼

&hwrite, //返回管道寫控制代碼

&sa,//security_attributes結構體指標 一定不能為null否則子程序不能繼承返回的控制代碼

0//管道的buffer大小 0表示預設大小

) ;

process_information pp=;//接收程序資訊

startupinfo si =; //表示子程序如何顯示

si.cb=sizeof(startupinfo) ;//大小

si.dwflags=startf_useshowwindow ;//指定那些可用

si.hstdinput=hread ;//設定標準輸入控制代碼 為管道讀取控制代碼

si.hstdoutput=hwrite ;//設定標準輸出控制代碼為管道寫控制代碼

si.hstderror=::getstdhandle(std_error_handle) ;//呼叫函式獲得標準錯誤控制代碼

createprocess("sub.exe",//可執行模組的完整路徑

null ,//命令列引數

null,//預設安全結構屬性 null

null,//同上

true,//子程序是否從calling他的程序繼承控制代碼

0,//表示啟動程序時的附加標記 這裡我們只是建立乙個程序設定為 0即可

null,//表示新程序使用的記憶體塊 null表示子程序使用父程序的記憶體塊

null,//表示啟動時子程序的路徑名 如果為null表示子程序和父程序使用相同的路徑名

&si ,//表示子程序如何顯示 還有為標準輸入輸出 標準錯誤控制代碼賦值為管道控制代碼

&pp) ;//lpprocess_information 結構體用來接收建立的子程序的資訊

}/子程序

#include

#include "windows.h"

using namespace std ;

void main()

{handle hread=::getstdhandle(std_input_handle) ;

char buf[100] ="";

dword len ;

::readfile(hread,buf,100,&len,null) ;

cout<<"讀取到:"<

程序之間通訊 無名管道

程序之間常用的通訊方式有 1 無名管道 具有親緣關係的父子程序 2 有名管道 任意兩個程序 3 訊號 4 訊息佇列 5 記憶體共享 6 訊號量 一般是程序之間同步的手段,一般配合互斥鎖 條件變數一起使用 7 socket套接字 現在介紹最簡單的無名管道,用到的api函式如下 比較簡單,我們可以定義乙...

程序之間的通訊之管道

管道的整體 有名 無名 概念 我們通常把乙個程序的輸出通過一塊記憶體連線到另外乙個程序的輸入。特徵 1.半雙工通訊方式,同一時刻資料只能單向流動。2.類似於資料結構中的佇列,遵循先進先出的原則。3.管道中的資料具有一次性,一旦被讀走,將被從管道中移除。4.沒有具體的檔名標識,所以只能在父子程序中通訊...

Linux中父子程序之間的通訊

在linux系統中實現父子程序的通訊可以採用pipe 和fork 函式進行實現。利用兩個管道在父子程序之間進行通訊如 1 include2 include3 include4 include5 include 6int main void 23 24 pid fork 25if 1 pid 此處為了...