Как да се затвори процеса на създаване през createprocess

Как да се затвори процеса на създаване през CreateProcess

Има 2 варианта на процеса на приключване:
1.

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

2.

TerminateProcess (pi.hProcess, NO_ERROR);

1. Коя е най-правилно?
2. И ако първият вариант за затваряне на нишката трябва да бъде и защо?
3. Какво е затваряне на първия: процесът или темата?

Първият вариант - това не е процес на приключване, а дръжката на освобождаване.
Можете да използвате TerminateProcess, или да изпратите съобщение до WM_QUIT. В края на този процес, потоци си се изтриват автоматично. След завършване на основния поток на процеса той също се прекратява автоматично.


> При завършване на основния процес поток също завършва
> автоматично

Откъде взехте. процес приключва след приключване на всички kod.potokov съществуващата в своя контекст, а не само на земята.

т.е. необходимо и достатъчно за правилното попълване на един и същ процес е валидна за да завърши всичките си kod.potokov

коректността на същото тук изобщо не става въпрос за TerminateProcess () съществува метод за аварийно изваждане на стоката от процес, при който всички негови кодови потоци (без значение колко те могат да бъдат) са също имплицитно необичайно прекратено.

Доколкото мога да си спомня Рихтер поток е създаден в началото на процеса, той е "майстор", а завършването му включва завършване на целия процес с другите потоци. Но книгата на ръка не е, нека съди Игор :)

Игор мотивирано. Греша :)

изтрит от модератора
Забележка: Offtopic

Така че, обобщавайки, се оказва, че (popravte ако греша):
1. Ако искам да се блъсне в процеса на създаване на мен, аз пиша TerminateProcess (pi.hProcess, NO_ERROR);
2 Ако аз просто искам да завършат процеса на създаване на мен, тогава аз пиша PostThreadMessage (pi.dwThreadId, WM_QUIT, 0,0);

Използването на първото изречение ми един вариант води до затваряне на дръжки на процеса и неговото поток, и не включва неговото затваряне.


> 1. Ако искам да се блъсне в процеса на създаване на мен,
> Пиша TerminateProcess (pi.hProcess, NO_ERROR);

Да, ако имате съответните права на


> Ако аз просто искам да се завърши процесът на създаване ми,
> Запис PostThreadMessage (pi.dwThreadId, WM_QUIT, 0,0);

не на факта. като цяло, 100% гаранция, че това ще се реши задачата, не.


> Използването на първото изречение ме 1 опция води
> За затварянето дръжки върху процеса и неговото поток, и не включва
> Го затворите.


> Какво може да е проблем (моята програма пренасочва
> I / O конзолата заявка (Cmd.exe))?

след като направите това, просто изпраща kons.oknu команда "EXIT".
разбира се, на "EXIT" на конзолата ще реагира само ако е в очакване на въвеждане на командния ред един

Да, веднъж на "EXIT", а аз не мисля. ) Cmd.exe затваря без проблем.
Мислех, че за него и реши, че по-точно за мен в тази ситуация, затворете конзолата все още се използват TerminateProcess, защото конзолата наистина не може да бъде готов да приеме никого. линия.
Много благодаря за помощ.

Има още едно условие, за което рядко се споменава - трябва да бъдат освободени всички външни връзки на процеса от други процеси (тя дръжки са затворени), т.е. Това е случай, в който са завършени всички нишки на процеса, и то формално съществува.

Рихтер, между другото, и за това, е :)


> Това е случай, в който вече са приключили всички нишки,
> Както формално съществува

Да, има. но не и в списъка на стартираните процеси, както и други sist.strukturah. тук ние говорим за потенциал изтичане на ресурс, който всъщност не е страшно. тези ресурси ще бъдат пуснати заедно с приключването на процеса, за да "хвърлят" разкри, че свързва изрично

тук ние говорим за потенциал изтичане на ресурс

IMHO не само - това е направено много интелигентно.

Например, CreateProcess върна валиден ЕВРОВОК и процесът по някаква причина внезапно приключила. защото ЕВРОВОК на процеса остава в сила с него все още могат да работят. Такова искане GetExitCodeProcess код за изход (hProcess, ExitCode) и се уверете, че процесът е завършен (ExitCode <> STILL_ACTIVE), или просто да го прехвърли на функцията на готовност (това не свършва с WAIT_FAILED код и просто да се върне WAIT_OBJECT_0).


> Тъй ЕВРОВОК на процеса остава в сила с него
> Все още можете да работите

Аз не споря. на дескриптора в който е получена и се записва.

След TerminateProcess на повикване (pi.hProcess, NO_ERROR); ЕВРОВОК все още е валиден?
Т.е. дали е необходимо след това да го затвори използва CloseHandle (pi.hProcess).

Дескриптори се използва в програмата си, така че трябва да бъдат затворени.

MSDN призова близо :)