Cum se închide procesul de creație prin CreateProcess

Cum se închide procesul de creație prin CreateProcess

Există 2 variante ale procesului de închidere:
1.

CloseHandle (pi.hThread);
CloseHandle (pi.hProcess);

2.

TerminateProcess (pi.hProcess, NO_ERROR);

1. Care este cea mai corectă?
2. Și dacă prima opțiune pentru a închide firul trebuie să fie și de ce?
3. Ce este de a închide primul: proces sau fir?

Prima opțiune - nu este procesul de închidere, și mânerul de eliberare.
Puteți folosi TerminateProcess, sau trimite un mesaj la WM_QUIT. La încheierea procesului, fluxurile sale sunt șterse automat. La finalizarea fluxului principal al procesului este, de asemenea reziliat automat.


> La finalizarea fluxului principal de proces se termină, de asemenea,
> în mod automat

unde ai luat. proces se finalizează după finalizarea tuturor kod.potokov existente în contextul său, nu numai la sol.

și anume necesare și suficiente pentru completarea corectă a aceluiași proces este valabil pentru a finaliza toate kod.potokov sale

corectitudinea același aici, în general, nu există nici o întrebare, pentru TerminateProcess () există o metodă de îndepărtare de urgență dintr-un proces în care toate fluxurile sale de cod (indiferent de cât de mult pot fi) sunt, de asemenea, încetează implicit anormal.

Din câte îmi amintesc fluxul Richter creat la începutul procesului, acesta este „maestru“, iar finalizarea acestuia presupune finalizarea întregului proces cu celelalte fluxuri. Dar cartea la îndemână, nu este, să ne judece Igor :)

Igor motivat. Sunt greșit :)

șters de către moderator
Notă: Offtopic

Deci, rezumând, se pare că (popravte dacă am greșit):
1. Dacă vreau să crash procesul de creare mine, eu scriu TerminateProcess (pi.hProcess, NO_ERROR);
2 Dacă vreau doar pentru a finaliza procesul de creare mine, atunci am scrie PostThreadMessage (pi.dwThreadId, WM_QUIT, 0,0);

Folosirea primei teze mi-1 variantă conduce la închiderea mânere procesul și fluxul său, și nu implică închiderea acesteia.


> 1. Dacă vreau să crash procesul de creare mine,
> I-am scris TerminateProcess (pi.hProcess, NO_ERROR);

Da, dacă aveți drepturile necesare asupra


> Dacă vreau doar pentru a finaliza procesul de creare a mea,
> Scriere PostThreadMessage (pi.dwThreadId, WM_QUIT, 0,0);

nu faptul. în general, o garanție de 100% că acest lucru se va rezolva sarcina, nr.


> Utilizarea primei fraze mi-1 opțiune conduce
> Pentru închidere mânerele procesului și fluxul său, și nu implică
> Închide-l.


> Care ar putea fi problema (redirecționările programul meu
> / O Console Application I (Cmd.exe))?

odată ce ai făcut asta, doar trimite comanda kons.oknu „EXIT“.
desigur, la „EXIT“ consola va reacționa doar dacă este în așteptare pentru linia de comandă de intrare unul

Da, o dată pe „EXIT“, și nu mă gândeam. ) Cmd.exe se închide fără nici o problemă.
M-am gândit la asta și a decis că mai precise pentru mine în această situație, închideți consola încă folosind TerminateProcess, deoarece consola nu poate fi într-adevăr gata să accepte pe oricine. line.
Multumesc multe pentru ajutor.

Există o altă condiție, despre care rareori menționate - ar trebui să fie eliberate toate link-urile externe asupra procesului de la alte procese (rezolvǎ sunt închise), adică Acesta este un caz în care toate firele procesului au fost finalizate, și există în mod oficial.

Richter, de altfel, despre asta, de asemenea, este :)


> Este un caz în care toate firele au fost deja finalizate,
> Așa cum există în mod oficial

Da, există. dar nu și în lista de procese care rulează, și alte sist.strukturah. aici vorbim despre o scurgere de resurse potențial, care nu este de fapt teribil. aceste resurse va fi lansat împreună cu finalizarea procesului, pentru a „arunca“ descoperit ei leagă explicit

aici vorbim despre un potențial de scurgere de resurse

IMHO nu numai - se face foarte inteligent.

De exemplu, CreateProcess returnat un descriptor valid și procesul pentru un motiv oarecare sa încheiat brusc. pentru că descriptor al procesului rămâne valabil cu ea poate lucra în continuare. O astfel de solicitare GetExitCodeProcess cod de ieșire (hProcess, Exitcode) și asigurați-vă că procesul este finalizat (Exitcode <> STILL_ACTIVE), sau pur și simplu transfer la funcția de standby (nu se termină cu codul WAIT_FAILED și pur și simplu a reveni WAIT_OBJECT_0).


> Deoarece descriptor al procesului rămâne valabil cu el
> Puteți lucra în continuare

Nu infirm. pe descriptorul a fost primit și înregistrat.

După TerminateProcess apelului (pi.hProcess, NO_ERROR); descriptor este încă valabil?
Ie dacă este necesar, atunci închideți folosind CloseHandle (pi.hProcess);.

Descriptorul este utilizat în programul dumneavoastră, așa că ar trebui să fie închise.

MSDN îndeamnă aproape :)