通過父程序控制子程序並接管子程序輸入來達到自動輸入一些預設命令功能,待預設命令執行完畢後,可以輸入命令還原子程序標準輸入.
control.cpp:
#include #include #include #include #include #include int main()
ret = createpipe(&hpipeinputread2,&hpipeoutputwrite2,&sa,null);
if(ret == false)
////
////
handle hstdout = getstdhandle(std_output_handle);
startupinfoa si = ;
getstartupinfoa(&si); //該函式返回程序在啟動時被指定的startupinfo 結構
si.cb = sizeof(si);
si.dwflags = startf_useshowwindow | startf_usestdhandles ;
si.wshowwindow = sw_shownormal;
si.hstdinput = hpipeinputread; //輸入由標準輸入 -> 從管道中讀取
= hpipeoutputwrite2; //用於本地接管標準輸出
si.hstdoutput = hstdout; //輸出由標準輸出 -> 輸出到管道
process_information pinfo;
memset(&pinfo,0,sizeof(process_information));
ret = createprocessa("e:/開發/開發/message/debug/message.exe",
null,&sa,null,
true,
create_new_console | create_new_process_group
, null,null,&si,&pinfo);
if(ret == false)else
closehandle(hpipeinputread);
closehandle(hpipeinputread2);
closehandle(hpipeoutputwrite2);
closehandle(hstdout);
int index = 0;
char buffer[1024] = ;
dword writebyte = 0;
dword readbyte = 0;
while(true)
else
*//*int nret = peeknamedpipe(hpipeinputread2,buffer,1,(lpdword)&readbyte,null,null);
if(nret)*/
} }closehandle(hpipeoutputwrite);
return 0;
}
message.cpp:
#include #include #include #include #include #include#include #include int main()
if(strncmp("quit",line.c_str(),4) == 0)
//解除pipe鎖定標準輸入
else if(strncmp("default",line.c_str(),7) == 0 && !activation)
else if(strncmp("default",line.c_str(),7) == 0 && activation)
else
line.clear();
} return 0;
}
linux管道pipe父子程序通訊的示例
父程序開啟的檔案描述符在子程序仍然保持開啟,檔案描述符的引用計數 1,不僅如此,父程序使用者根目錄 當前目錄等變數的引用計數也會 1.即使呼叫exec函式,檔案描述符也不會關閉,除非設定了sock cloexec屬性。include include include include int main ...
程序通訊之pipe通訊
管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 管道作用於有血緣關係的程序之間,通過fork來傳遞呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述...
fork建立子程序利用pipe管道通訊
這裡。每個程序各自有不同的使用者位址空間,任 何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interprocess comm...