c++ WinApi нубовопрос про CreateProcess/TerminateProcess в многопочке.

markyzz

В одном потоке создаю процесс и слушаю его в пайпе.
CreateProcess(NULL, fileNameC, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) 
while (true)... (чтение из пайпа)
закрываю:
CloseHandle(pi.hThread)
CloseHandle(pi.hProcess)

Во втором потоке убиваю его по тайму по ПИД-у
HANDLE timerXhProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); 
BOOL terminateResult = TerminateProcess(timerXhProcess, exCode);
CloseHandle(timerXhProcess)

В итоге, после убийства появляется незакрытый хэндл (Non existant Process).
Подскажите, плз, что сделать, чтобы избежать призраков.

Dasar

в первом потоке handle process-а ты в итоге закрываешь, если процесс прибивается?

markyzz

в первом потоке handle process-а ты в итоге закрываешь, если процесс прибивается?
Да. Во всяком случае, команда, закрывающая хэндл ошибки не выдает.

Maurog

В одном потоке создаю процесс и слушаю его в пайпе.
больше кода надо
пока гипотеза в том, что какой-то хендл ты забыл все же закрыть
гугл подтверждает : http://forum.sysinternals.com/nonexistent-process_topic9098.... :grin:

markyzz

больше кода надо
проблема даже реализуется вот на таком примере:
(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.";
}

yolki

от пайпов разве не надо DuplicateHandle сделать?
пруф: http://support.microsoft.com/kb/190351/en-us

markyzz

Все... меня нокаутировали... дело и не в пайпах и не в потоках.
Вот полный код, который плодит хэндлы.... Ааааааа.... Чо делать-то?
   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);
}
}

yolki

до TerminateProcess - WaitForSingleObject?
http://support.microsoft.com/kb/178893/en-us

Maurog

Вот полный код, который плодит хэндлы
похож на этот: http://forum.avira.com/wbb/index.php?page=Thread&thread...
у тебя какая винда?

yolki

ждать хендл имеет смысл только если сам процесс выходит.
для нотепада убедительнее будет послать ему WM_CLOSE
как вариант - подселить ему тред, который скажет "умри".
гуглить по SafeTerminateProcess

markyzz

у тебя какая винда?
угу... проблема появляется только на ХР. На 7-ке ничего подобного не происходит.....
Видимо, закрыто, тогда. :cool:
Оставить комментарий
Имя или ник:
Комментарий: