procese pentru copii

Ce se întâmplă atunci când procesul este complet

Dar acest lucru se întâmplă.

1. Performanța tuturor fluxurilor în procesul este terminat

2. Toate GDI-și utilizator, obiectele create de proces, sunt eliminate, iar obeyuy miez închis (în cazul în care nu proces ispolzuetdrugoy).

3. Procesul Valoarea codului de ieșire variază în funcție de STILL_ACTIVE la codul transmis rice în ExitProcess sau TerminateProcess.

4. Obiectul „proces“ de bază merge la ralanti, sau nealocat (semnalata), constând Yanie (Mai multe despre acest subiect, a se vedea capitolul 9) Alte fluxuri din sistem se poate opri cu executarea acestuia până la finalizarea procesului.

5. Contor „proces“ obiect nucleu este decrementat cu 1

Legat de completează obiectul nucleu de proces nu este eliberat până când acestea sunt închise și link-uri pentru a-l de la alte procese. La momentul finalizării procesului, sistemul reduce automat contorul de utilizare a obiectului 1 și obiectul este distrus imediat ce contra acesteia este resetat. În plus, procesul de închidere nu se completează în mod automat procesele generate de acestea

La finalizarea ID-ul său proces și resursele alocate acestuia sunt șterse din memorie. Cu toate acestea, zona de memorie alocată obiectului nucleu de sistem „proces“, nu maestru bozhdaetsya până când numărul de numărul de utilizatori a ajuns la zero Acest copii pro, atunci când toate celelalte procese care creează sau descriptorii deschise pentru acum asupra procesului de Coyne, informează sistemul (prin apelare CloseHandle) care face legătura pas acest proces nu mai au nevoie.

Descriptori finalizate protsessse deja Myalo ce sunt potrivite. Cu excepția faptului că procesul de Sumerian de rodiu prin apelarea GetExitCodeProcess, se poate proverig dacă procesul identificat de parametrul hProcess finalizat, și, în caz afirmativ, pentru a determina codul Zavar sheniya:

BOOL GetExitCodeProcess (HANDLE hProcess, PDWORD pdwExitCode);

Codul de finalizare este returnat ca o valoare DWORD care a subliniat pdwExitCode. Dacă pas timpul procesului de apel GetExitCodeProcess nu este încă finalizată, în DWORD a intrat identificator STILL_ACTIVE (definit ca 0x103) Și dacă acesta este distrus, funcția returnează finalizarea cod real.

Poate credeți că puteți scrie cod care periodic vyzy funcția GetExitCodeProcess mână și verificarea valorii de întoarcere, va determina momentul finalizării procesului. În principiu, un astfel de cod ar putea lucra în multe situații, dar op ar fi ineficientă. Cum de a rezolva această problemă, voi discuta în secțiunea următoare.

Atunci când dezvoltarea de aplicații de multe ori nevoie pentru a obține un fel de vypol operațiune nyal alt bloc de cod. Deci - o vrei sau nu - trebuie să în mod constant funcția Vat vyzy sau subrutină. Dar apelul funcției conduce la suspendarea la îndeplinirea codului de bază al programului la revenirea functia apelata modifica mod nativ - să se angajeze să facă un fel de operațiune într-un alt fir în cadrul procesului (de curgere, desigur, trebuie să creați mai întâi). Acest lucru permite

Codul principal aprins al programului să-și continue activitatea la momentul respectiv, ca un flux suplimentar va efectua o altă operație. Recepția este foarte convenabil, dar atunci când fluxul principal de necesitatea de a mii cunosc rezultatele unui alt fir, nu puteți evita problemele asociate cu calendarul.

cutii poștale (mailslots), etc., și una dintre modalitățile cele mai convenabile de a oferi acces partajat la date. - partajarea de fișiere, proxy proiectat în memorie (fișierele de memorie mapate) (Citește mai mult pe acest subiect, a se vedea capitolul 17).

Dacă doriți să creați un nou proces pentru a face efectua Kakisa Lake un operator de radio și să aștepte pentru rezultatele lor, scrie codul ca aceasta

// proces copil

BOOL fSuccess = CreateProcess (. pi>;

// închide mânerul să curgă imediat ce nevoia de ea dispare!

// suspendă execuția procesului părinte,

// până la sfârșitul procesului de copil

WaitForSingleObject (hProcess pi, INFINlTI);

// procesul copil este finalizat; Obținem finalizarea cod

// închide mânerul în proces, de îndată ce nu este nevoie de ea!

În acest cod, am creat un nou proces și, în caz de succes, funcția numită WaitForSingleQbject

DWORD WaitForSingleObject (HANDLE hObject, DWORD dwTimeOut);

O examinare detaliată a acestei funcții va fi amânată până când capul de 0, iar acum ne limităm la o execuție considerare Funcția de cod de întârziere până

până când obiectul parametru definit bObject, nu va merge la liber starea (mers în gol). Obiectul „proces“ se înscrie în această stare la capătul său cu privire la această WaitForSingleObject apel suspendă firul procesului părinte până la finalizarea proceselor sale de copil. Când WaitForSingleObject se întoarce, veți învăța codul procesului de copil prin intermediul funcției Get ExitCodeProcess.

Accesarea CloseHandle în fragmentul de cod de mai sus de mai sus determină ca sistemul să reducă valorile contori mu obiecte „stream“ și „proces“ la zero, și astfel eliberează memoria ocupată de aceste obiecte.

Este posibil să fi observat că în acest pasaj am închis mânerul la obiectul nucleu „fluxul principal“ (aparținând procesului de copil), imediat după revenirea CreateProcess. Acest lucru nu duce la finalizarea fluxul principal filiala protses ca - pur și simplu reduce contorul asociat cu obiectul menționat. Și asta este motivul pentru care se face

- și prin modul în care, chiar și încurajat să facă - adică, va fi clar din exemplul unui prim. Să presupunem că procesul de copil flux primar generează un alt flux, iar apoi se termină. În acest moment, sistemul poate elibera „flux primar“ procesul copil obiect în memorie, în cazul în care părintele procesului nu este un descriptor al acestui obiect. Dar dacă părintele are un astfel de descriptor, sistemul nu va fi capabil de a elimina obiectul din memorie, atâta timp cât procesul părinte se închide descriptor său.

Rularea procese separate pentru copii

Spune ce-ți place, dar de cele mai multe cererii încă generează alte procese ca un lennye izolat (procese detașate) Aceasta înseamnă că, după crearea și începerea unui nou proces la procesul părinte nu trebuie să comunice cu ea sau așteptați până când a terminat de lucru cu precizie și funcționează Explorer: lanseaza noi procese pentru utilizator, și apoi nu-i pasă ce se întâmplă cu ei.

Pentru a taie toate cordonul ombilical care leagă Explorer proces C copil, este necesar (prin apelarea CloseHandle) închide descriptorii lor asociate cu noul proces și fragmentul său flux primar de mai jos demonstrează modul în care, prin crearea unui proces pentru a face separarea

BOOL fSuccess = CreateProcess (. pi); if (fSuccess)

articole similare