管道读不出数据

chary1993 2013-06-26 10:05:21
#include <WINDOWS.H>
#include <stdio.h>

DWORD WINAPI ThreadOnputProc(LPVOID lpParameter);
HANDLE hRead1=NULL,hWrite1=NULL;
HANDLE hRead2=NULL,hWrite2=NULL;

CRITICAL_SECTION g_cs;
BOOL threadFlag=FALSE;

void main()
{

InitializeCriticalSection(&g_cs);
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);

if(!CreatePipe(&hRead1,&hWrite1,&sa,0) || !CreatePipe(&hRead2,&hWrite2,&sa,0))
{
printf("创建管道失败");
return;
}
char lzCmdline[200];
GetSystemDirectory(lzCmdline,200);
strcat(lzCmdline,"\\cmd.exe");
STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdInput = hRead1;
si.hStdOutput = si.hStdError = hWrite2;
si.wShowWindow = SW_HIDE;

PROCESS_INFORMATION pi;
if(!CreateProcess(lzCmdline,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
{
printf("创建进程失败");
return ;
}
CreateThread(NULL,0,ThreadOnputProc,NULL,0,0);
char readbuff[1024];
memset(readbuff,0,1024);

DWORD dwTotalAvail;
char writebuff[100];
DWORD dwWrite;
while (TRUE)
{
EnterCriticalSection(&g_cs);
dwTotalAvail=0;
if(threadFlag)
{
// printf("Please Input cmd:\n");
gets(writebuff);
if(!WriteFile(hWrite1, writebuff, sizeof(writebuff), &dwWrite, NULL))
{
printf("写入失败");
return ;
}
threadFlag=FALSE;
}

LeaveCriticalSection(&g_cs);
Sleep(100);

}
CloseHandle(hWrite1);
CloseHandle(hWrite2);
CloseHandle(hRead1);
CloseHandle(hRead2);

}


DWORD WINAPI ThreadOnputProc(LPVOID lpParameter)
{
char readbuff[1024];

DWORD dwRead,dwTotalAvail = 0;
BOOL bRet=FALSE;
while(TRUE)
{
EnterCriticalSection(&g_cs);
if (!threadFlag)
{
memset(readbuff,0,1024);
bRet = PeekNamedPipe(hRead2, NULL, 0, NULL, &dwTotalAvail, NULL);
if (bRet && dwTotalAvail > 0)
{
ReadFile(hRead2,readbuff,1024,&dwRead,NULL);
printf("%s",readbuff);
threadFlag=TRUE;
}
}
LeaveCriticalSection(&g_cs);
Sleep(10);
}
return TRUE;
}

本来想建立个双管道,创建一个cmd进程,一个管道进行cmd命令的输入(另外主线程),另一个管道进行cmd执行结果的输出(另创建个线程),但是出现问题了,只有第一次收到了初始化信息,后来dwTotalAvail都是0,也就说管道里没有数据。。错在那哪????求指出。。
...全文
254 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyang500 2013-09-03
  • 打赏
  • 举报
回复
引用 4 楼 chary1993 的回复:
[quote=引用 3 楼 sunyang500 的回复:] 你的criticalsection 能够在不同的进程间使用么?如果不行的话那么另外一个进程是不能够进入criticalsection的,请你在进入while循环后抛下数据,看那是否能够进入临界区。
知道哪里错了,,只需在WriteFile时写入数据时候数据后加个“\n”就行了。。[/quote] 这。。。。Bug真苦逼啊。。。
chary1993 2013-06-27
  • 打赏
  • 举报
回复
引用 3 楼 sunyang500 的回复:
你的criticalsection 能够在不同的进程间使用么?如果不行的话那么另外一个进程是不能够进入criticalsection的,请你在进入while循环后抛下数据,看那是否能够进入临界区。
知道哪里错了,,只需在WriteFile时写入数据时候数据后加个“\n”就行了。。
sunyang500 2013-06-27
  • 打赏
  • 举报
回复
你的criticalsection 能够在不同的进程间使用么?如果不行的话那么另外一个进程是不能够进入criticalsection的,请你在进入while循环后抛下数据,看那是否能够进入临界区。
chary1993 2013-06-26
  • 打赏
  • 举报
回复
WRITE2是在cmd中si.hStdOutput = si.hStdError = hWrite2;中的,也就是cmd的输出啊。。
spotatoes 2013-06-26
  • 打赏
  • 举报
回复
你的逻辑有问题,创建 的READ1,WRITE1, 线程里面去READ2,根本没有WRITE2,何来READ2.兄台慢慢想想吧。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧