首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

双管道(CreatePipe)与cmd.exe进程间通信的有关问题

2012-10-27 
双管道(CreatePipe)与cmd.exe进程间通信的问题先贴代码:C/C++ codeHANDLE hReadPipe1,hWritePipe1,hReadPi

双管道(CreatePipe)与cmd.exe进程间通信的问题
先贴代码:

C/C++ code
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道UINT __stdcall sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联{        char Buff[SEND_BUFF_SIZE];    TCHAR sendBuff[SEND_BUFF_SIZE];    SECURITY_ATTRIBUTES sa;    sa.nLength=12;    sa.lpSecurityDescriptor=0;    sa.bInheritHandle=true;        int ret;    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道    {        return -1;    }    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))    {        return -1;    }    STARTUPINFO si;    ZeroMemory(&si,sizeof(si));    GetStartupInfo(&si);    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;    si.wShowWindow = SW_HIDE;    si.hStdInput = hReadPipe2;    si.hStdOutput = si.hStdError = hWritePipe1;    TCHAR cmdLine[256] = {0};    GetSystemDirectory(cmdLine,sizeof(cmdLine));    wcscat(cmdLine,L"\\cmd.exe");    PROCESS_INFORMATION ProcessInformation;    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)    {        return -1;    }        unsigned long lBytesRead;         Sleep(100);    while(TRUE) //开始循环读取或写入信息    {         ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读         if(lBytesRead)             {            //第一次可以读到cmd的初始化信息            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据            if(!ret)                break;            //如果读到数据,则对数据进行下一步处理。。。。。。。                  }          else          {                          if(!WriteFile(hWritePipe2,L"dir",sizeof(L"dir"),&lBytesRead,0))                                     {                        return -1;              }            //这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0           }        }     return 0;}


问题是:
为什么启动cmd.exe时能读到(ReadFile)的初始化信息,
但是再WriteFile(往管道里写数据后),cmd却没有任何信息,即PeekNamedPipe函数中的参数lBytesRead总是为零?
难道是管道没写进去?

[解决办法]
C/C++ code
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道UINT __cdecl sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联{    TCHAR Buff[SEND_BUFF_SIZE] = {0};    TCHAR sendBuff[SEND_BUFF_SIZE] = _T("dir \n");    SECURITY_ATTRIBUTES sa;    sa.nLength=sizeof(sa);    sa.lpSecurityDescriptor=0;    sa.bInheritHandle=true;        int ret;    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道    {        return -1;    }    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))    {        return -1;    }    STARTUPINFO si;    ZeroMemory(&si,sizeof(si));    GetStartupInfo(&si);    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;    si.wShowWindow = SW_HIDE;    si.hStdInput = hReadPipe2;    si.hStdOutput = si.hStdError = hWritePipe1;    TCHAR cmdLine[256] = {0};    GetSystemDirectory(cmdLine,sizeof(cmdLine));    _tcscat(cmdLine, _T("\\cmd.exe"));    PROCESS_INFORMATION ProcessInformation;    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)    {        return -1;    }        unsigned long lBytesRead;         Sleep(100);    while(TRUE) //开始循环读取或写入信息    {         ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读         if(lBytesRead)             {            //第一次可以读到cmd的初始化信息             memset(Buff, 0, sizeof(Buff));            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据            if(!ret)                break;            //如果读到数据,则对数据进行下一步处理。。。。。。。                  }          else          {              if(!WriteFile(hWritePipe2, sendBuff,sizeof(sendBuff),&lBytesRead,0))                                     {                        return -1;              }            //这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0           }        AfxMessageBox(CString(Buff));    }         return 0;} 


[解决办法]
我将取出来的buff再写入管道都可以,应该是你WriteFile的第二个和第三个参数的问题。

C/C++ code
if(!WriteFile(hWritePipe2,Buff,sizeof(Buff),&lBytesRead,0))                     {  return -1;}int errcode = GetLastError();
[解决办法]
windows的结束符是\r\n吧 linux的只是一个\n

热点排行