这程序泄漏了四个句柄(任务管理器),大伙帮忙找一下吧,我水平有限不晓得还哪里没Close.int main(LPCSTR s)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hRead=NULL,hWrite=NULL;
SECURITY_ATTRIBUTES sa;
DWORD bytesRead=0; sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
CreatePipe(&hRead,&hWrite,&sa,0);
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError=hWrite;
si.hStdOutput=hWrite;
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
TCHAR Cmdline[1024]={0},SendBuf[1024]={0}; GetSystemDirectory(Cmdline,sizeof (Cmdline));
strcat(Cmdline,"\\cmd.exe /c dir C:\\");
if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
return 0; CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hWrite);
while (TRUE)
{
if(ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
break;
printf(SendBuf);
Sleep(10);
}
CloseHandle(hRead);
memset(Cmdline,NULL,0);
memset(SendBuf,NULL,0); Sleep(5000); return 0;
}
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hRead=NULL,hWrite=NULL;
SECURITY_ATTRIBUTES sa;
DWORD bytesRead=0; sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
CreatePipe(&hRead,&hWrite,&sa,0);
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError=hWrite;
si.hStdOutput=hWrite;
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
TCHAR Cmdline[1024]={0},SendBuf[1024]={0}; GetSystemDirectory(Cmdline,sizeof (Cmdline));
strcat(Cmdline,"\\cmd.exe /c dir C:\\");
if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
return 0; CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hWrite);
while (TRUE)
{
if(ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
break;
printf(SendBuf);
Sleep(10);
}
CloseHandle(hRead);
memset(Cmdline,NULL,0);
memset(SendBuf,NULL,0); Sleep(5000); return 0;
}
再分别关闭hRead和hWrite,及进程的两个句柄之后,就泄漏了四个句柄.相信肯定是有泄漏,可我原来不是写C的,近几个月来开始尝试入手C,所以知识面不全,无法找出在什么地方泄漏,还望前人指点一二.
我用一个线程去启动这段代码,等线程返回并且销毁时,一共丢了五个句柄.
后来又测试用循环执行创建和销毁以上的这段代码,始终只丢这五个句柄,
并不会因为次数多而增加句柄的丢失.所以得个结论是:
在Windows上面运行这段代码会丢这几个句柄,在unix上则不会,可能跟Windows服务运行时间长导致系统变慢的原因相类似.
但我始终想让程序初始完成之后与程序运行完成并释放相应资源之后所占用的系统资源是一样的,
但由于技术有限却无能为力.
但是失败的时候就有泄露了,因为CreatePipe的够本没有关闭