Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Encerrar um processo tem os seguintes resultados:
- Todos os threads restantes no processo são marcados para encerramento.
- Todos os recursos alocados pelo processo são liberados.
- Todos os objetos do kernel são fechados.
- O código do processo é removido da memória.
- O código de saída do processo é definido.
- O objeto do processo é sinalizado.
Enquanto as alças abertas para objetos do kernel são fechadas automaticamente quando um processo termina, os próprios objetos existem até que todas as alças abertas para eles sejam fechadas. Portanto, um objeto permanecerá válido depois que um processo que o está usando for encerrado se outro processo tiver um identificador aberto para ele.
A funçãoGetExitCodeProcessretorna o status de encerramento de um processo. Enquanto um processo está em execução, seu status de término é STILL_ATIVE. Quando um processo termina, seu status de término muda de STILL_ATIVE para o código de saída do processo.
Quando um processo termina, o estado do objeto de processo torna-se sinalizado, liberando quaisquer threads que estavam aguardando o encerramento do processo. Para obter mais informações sobre sincronização, consulte Sincronizando a execução de vários threads.
Quando o sistema está encerrando um processo, ele não encerra nenhum processo filho que o processo tenha criado. Encerrar um processo não gera notificações para procedimentos de gancho WH_CBT.
Use a funçãoSetProcessShutdownParameters para especificar certos aspetos da terminação do processo no desligamento do sistema, como quando um processo deve ser encerrado em relação aos outros processos no sistema.
Como os processos são encerrados
Um processo é executado até que um dos seguintes eventos ocorra:
- Qualquer thread do processo chama a ExitProcess função. Note que em algumas implementações da biblioteca de tempo de execução C (CRT), a chamada ExitProcess é feita se o thread primário do processo retornar.
- O último thread do processo termina.
- Qualquer thread chama a função TerminateProcess com um identificador para o processo.
- Para processos de console, o manipulador de controle de console padrão chama ExitProcess quando o console recebe um sinal CTRL+C ou CTRL+BREAK.
- O utilizador desliga o sistema ou encerra a sessão.
Não encerre um processo a menos que seus threads estejam em estados conhecidos. Se um thread estiver aguardando em um objeto do kernel, ele não será encerrado até que a espera seja concluída. Isso pode fazer com que o aplicativo pare de responder.
O thread primário pode evitar encerrar outros threads direcionando-os para chamar ExitThread antes de fazer com que o processo seja encerrado (para obter mais informações, consulte Terminating a Thread). O thread primário ainda pode chamar ExitProcess depois para garantir que todos os threads sejam encerrados.
O código de saída para um processo é o valor especificado na chamada para ExitProcess ou TerminateProcess , ou o valor retornado pela função principal ou WinMain do processo. Se um processo for encerrado devido a uma exceção fatal, o código de saída é o valor da exceção que causou a rescisão. Além disso, esse valor é usado como o código de saída para todos os threads que estavam sendo executados quando a exceção ocorreu.
Se um processo for encerrado por ExitProcess, o sistema chamará a função de ponto de entrada de cada DLL anexada com um valor indicando que o processo está se desanexando da DLL. As DLLs não são notificadas quando um processo é encerrado pelo TerminateProcess. Para obter mais informações sobre DLLs, consulte Dynamic-Link Libraries.
Se um processo for encerrado por TerminateProcess , todos os threads do processo serão encerrados imediatamente, sem chance de executar código adicional. Isso significa que o thread não executa código em blocos do manipulador de terminação. Além disso, nenhuma DLL anexada é notificada de que o processo está sendo desassociado. Se você precisar que um processo encerre outro, as etapas a seguir fornecem uma solução melhor:
Faça com que ambos os processos chamem a função RegisterWindowMessage para criar uma mensagem privada.
Um processo pode encerrar o outro processo transmitindo uma mensagem privada usando a função BroadcastSystemMessage da seguinte maneira:
DWORD dwRecipients = BSM_APPLICATIONS; UINT uMessage = PM_MYMSG; WPARAM wParam = 0; LPARAM lParam = 0; BroadcastSystemMessage( BSF_IGNORECURRENTTASK, // do not send message to this process &dwRecipients, // broadcast only to applications uMessage, // registered private message wParam, // message-specific value lParam ); // message-specific valueO processo que recebe a mensagem privada chama ExitProcess para encerrar sua execução.
A execução das funções ExitProcess, ExitThread, CreateThread, CreateRemoteThreade CreateProcess é serializada dentro de um espaço de endereço. Aplicam-se as seguintes restrições:
- Durante a inicialização do processo e as rotinas de inicialização da DLL, novos threads podem ser criados, mas eles não começam a execução até que a inicialização da DLL seja concluída para o processo.
- Apenas um thread de cada vez pode estar em uma rotina de inicialização ou desanexação de DLL.
- A funçãoExitProcess não retorna até que não haja threads em suas rotinas de inicialização ou desanexação de DLL.