進程通信係列-匿名管道
匿名管道隻能在本機由父進程至子進程,優點在於子進程方便重定向,常用於應用程序內部
注意判斷此進程是父類還是子類,代碼長度一般
匿名管道類
#include "stdafx.h" #include "niming.h" #include <iostream> using namespace std; niming::niming(void) { } niming::~niming(void) { } int niming::build() { SECURITY_ATTRIBUTES sa; sa.bInheritHandle=TRUE; sa.lpSecurityDescriptor=NULL; sa.nLength=sizeof(SECURITY_ATTRIBUTES); if(!CreatePipe(&hRead,&hWrite,&sa,0)) { MessageBox(0,"創建失敗","error",0); return 0; } STARTUPINFO sui; ZeroMemory(&sui,sizeof(STARTUPINFO)); sui.cb=sizeof(STARTUPINFO); sui.dwFlags=STARTF_USESTDHANDLES; sui.hStdInput=hRead; sui.hStdOutput=hWrite; sui.hStdError=GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION ProcessInfo; if(CreateProcess("jxyprocess.exe",NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&ProcessInfo)) return 1; else return 0; } int niming::send(CString con) { DWORD d; if(WriteFile(hWrite,con,con.GetLength()+1,&d,NULL))return 1; return 0; } CString niming::recv() { DWORD dwRead; char ss[1024]; if(ReadFile(hRead , ss ,1024,&dwRead,NULL))return ss; return ""; } void niming::connect() { hRead=GetStdHandle(STD_INPUT_HANDLE); hWrite=GetStdHandle(STD_OUTPUT_HANDLE); return; } int niming::have() { bool s=cin.eof(); DWORD d; int pid; char ss[1024]; if(!s) { ReadFile(hRead , ss ,1024,&d,NULL); sscanf(ss,"pid-%d",&pid); if(pid==getpid())s=1; WriteFile(hWrite,ss,1024,&d,NULL); } return !s; }
最後更新:2017-04-03 20:19:50