匿名管道的ReadFile函数,独立线程调用,立即崩溃是什么原因?

fesil 2016-01-20 03:27:23
主线程 创建匿名管道 , 然后主线程启动一个新的线程去调用ReadFile ,线程一启动,程序就崩溃,但是单步调试是没问题的,看不明白是为什么,下面是代码, 也没捕捉不到异常......

新手不太懂,我主要是想有一个专门的线程去输出管道里的信息

HANDLE ChildIn_Read, ChildIn_Write;
HANDLE ChildOut_Read, ChildOut_Write;
#define BUFSIZE 2048

UINT HReadConsole(LPVOID lpParam)
{
BOOL flag = 0;
while(true)
{
char buffer[BUFSIZE] = { 0 };
DWORD BytesRead;
//从子进程读入
try
{
flag = ReadFile(ChildOut_Read, buffer, BUFSIZE, &BytesRead, NULL);
}
catch(...)
{
TRACE(_T(""));
}
if(!flag || (BytesRead == 0)) break;
//输出到文件
TRACE(_T("%s\n"), buffer);
}
AfxEndThread(0);
return 0;
}
void Ccontrol_DemoDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
#if 1 //使用了匿名管道重定向的方法
SECURITY_ATTRIBUTES saAttr = { 0 };
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;

//ChildIn_Write是子进程的输入句柄,ChildIn_Read是父进程用于写入子进程输入的句柄
CreatePipe(&ChildIn_Read, &ChildIn_Write, &saAttr, 0);
//设置子进程不能继承接收输入管道的另一端:ChildIn_Write
SetHandleInformation(ChildIn_Write, HANDLE_FLAG_INHERIT, 0);

//ChildOut_Write是子进程的输出句柄,ChildOut_Read是父进程用于读取子进程输出的句柄
CreatePipe(&ChildOut_Read, &ChildOut_Write, &saAttr, 0);
//设置子进程不能继承发送输出管道的另一端:ChildOut_Read
SetHandleInformation(ChildOut_Read, HANDLE_FLAG_INHERIT, 0);

STARTUPINFO StartupInfo = { 0 };
StartupInfo.cb = sizeof(STARTUPINFO);
//将标准输出和错误输出定向到我们建立的ChildOut_Write上
StartupInfo.hStdError = ChildOut_Write;
StartupInfo.hStdOutput = ChildOut_Write;
//将标准输入定向到我们建立的ChildIn_Read上
StartupInfo.hStdInput = ChildIn_Read;
//设置子进程接受StdIn以及StdOut的重定向
StartupInfo.dwFlags |= STARTF_USESTDHANDLES;

PROCESS_INFORMATION ProcessInfo = { 0 };

BOOL bSuccess = CreateProcess(NULL, "F:\\Steam\\steamapps\\common\\Don't Starve Together Dedicated Server\\bin\\dontstarve_dedicated_server_nullrenderer.exe -console",
NULL, NULL, TRUE, NULL, NULL, "F:\\Steam\\steamapps\\common\\Don't Starve Together Dedicated Server\\bin", &StartupInfo, &ProcessInfo);

AfxBeginThread(HReadConsole,NULL);

CDialogEx::OnOK();
}
...全文
444 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2016-01-22
  • 打赏
  • 举报
回复
管道的创建和使用有问题
ChildIn_Read, ChildIn_Write 这个是一个管道的两端
在 StartupInfo 你把这两个都填进去了, 逻辑上会导致输出的信息又会回到输入, 而且也会有问题
如果需要控制输入就需要创建2个管道, 端口就有4个

如果无需控制输入, 把 StartupInfo.hStdInput 设置为NULL
赵4老师 2016-01-21
  • 打赏
  • 举报
回复
请判断每个调用的返回值。
oyljerry 2016-01-20
  • 打赏
  • 举报
回复
先单步跟踪到出错的语句,然后就好分析,各种指针异常
lilianjie001 2016-01-20
  • 打赏
  • 举报
回复
dontstarve_dedicated_server_nullrenderer.exe是干嘛的? 或许不是读文件引起的

15,471

社区成员

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

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