c++ WinApi нубовопрос про CreateProcess/TerminateProcess в многопочке.
в первом потоке handle process-а ты в итоге закрываешь, если процесс прибивается?
в первом потоке handle process-а ты в итоге закрываешь, если процесс прибивается?Да. Во всяком случае, команда, закрывающая хэндл ошибки не выдает.
В одном потоке создаю процесс и слушаю его в пайпе.больше кода надо
пока гипотеза в том, что какой-то хендл ты забыл все же закрыть
гугл подтверждает : http://forum.sysinternals.com/nonexistent-process_topic9098....
больше кода надопроблема даже реализуется вот на таком примере:
(Log соотвественно, просто логирование, заменить на cerr - ничего не изменится)
первый поток ( даже убрал чтение из пайпа:)
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hReadOut;
HANDLE hWriteOut;
HANDLE hReadIn;
HANDLE hWriteIn;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;//*rts* TRUE
sa.lpSecurityDescriptor = NULL;
if(!CreatePipe(&hReadOut, &hWriteOut, &sa, 0 Log(DEBUG_LOG, 7 "(Main script) Output pipe creation ERROR.";
if(!CreatePipe(&hReadIn, &hWriteIn, &sa, 0 Log(ERROR_LOG, 12 "(Main script) Input pipe creation ERROR.";
memset(&si, 0, sizeof(si;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadIn;
si.hStdOutput = hWriteOut;
si.hStdError = hWriteOut;
memset(&pi, 0, sizeof(pi;
if(!CreateProcess(NULL, fileNameC, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi Log(DEBUG_LOG, 7 "(Main script) Process creation ERROR.";
timerX.pid = pi.dwProcessId;
if (!CloseHandle(hWriteOut Log(DEBUG_LOG, 7 "(Main script) Closing hWriteOut-handler ERROR.";
if(!CloseHandle(hReadIn Log(DEBUG_LOG, 7 "(Main script) Closing hReadIn-handler ERROR.";
if(!CloseHandle(hReadOut Log(DEBUG_LOG, 7 "(Main script) Closing hReadOut-handler ERROR.";
if(!CloseHandle(hWriteIn Log(DEBUG_LOG, 7 "(Main script) Closing hWriteIn-handler ERROR.";
WaitForSingleObject(pi.hProcess, INFINITE);
if(!CloseHandle(pi.hProcess Log(DEBUG_LOG, 7 "(Main script) Closing [PROCESS]-handler ERROR.";
if(!CloseHandle(pi.hThread Log(DEBUG_LOG, 7 "(Main script) Closing [THREAD]-handler ERROR.";
второму потоку передается пид для убийства:
HANDLE timerXhProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if(timerXhProcess == NULL)
{
Log(DEBUG_LOG, 7"(TimerX) Opening process (for termination) FAILED.";
}
else
{
UINT exCode;
BOOL terminateResult = TerminateProcess(timerXhProcess, exCode);
if(!CloseHandle(timerXhProcess Log(DEBUG_LOG, 7 "(TimerX) Closing [PROCESS]-handle ERROR.";
}
Вот полный код, который плодит хэндлы.... Ааааааа.... Чо делать-то?
string str = "notepad.exe";
char * fileNameC = new char[str.size+1];
std::copy(str.begin str.end fileNameC);
fileNameC[str.size] = '\0';
while (true)
{
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO;
PROCESS_INFORMATION pi;
if(CreateProcess(NULL, fileNameC, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi
{
Sleep(3000);
TerminateProcess(pi.hProcess, NO_ERROR);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
Sleep(3000);
}
}
Вот полный код, который плодит хэндлыпохож на этот: http://forum.avira.com/wbb/index.php?page=Thread&thread...
у тебя какая винда?
для нотепада убедительнее будет послать ему WM_CLOSE
как вариант - подселить ему тред, который скажет "умри".
гуглить по SafeTerminateProcess
у тебя какая винда?угу... проблема появляется только на ХР. На 7-ке ничего подобного не происходит.....
Видимо, закрыто, тогда.
Оставить комментарий
markyzz
В одном потоке создаю процесс и слушаю его в пайпе.Во втором потоке убиваю его по тайму по ПИД-у
В итоге, после убийства появляется незакрытый хэндл (Non existant Process).
Подскажите, плз, что сделать, чтобы избежать призраков.