Thursday 14 December 2017

Daemonize c # process waitforexit


Estou criando uma aplicação GUI usando Visual C 2005 (net framework 2). Eu uso o seguinte código para iniciar um processo: eu quero que meu aplicativo aguarde até que este processo seja concluído, então usei WaitForExit. Mas o Windows GUI congela enquanto o app. exe está sendo executado. Eu quero que ele responda (por exemplo, pressione um botão cancelar), mas eu não quero o código para continuar, porque há um outro processo para iniciar depois de. Agradeço antecipadamente perguntou 13 de novembro 09 às 9:19 Talvez você deva implementar uma solução com o BackgroundWorker. É fácil de implementar e faz o que você quer. O que você tem a fazer é adicionar uma instância de um BackgroundWorker em seu formulário e fazer a chamada para o processo executando o App. exe a partir do BackgrondWorker RunWorkerAsync método. Em seguida, você pode monitorar uma propriedade CancelationPending para interromper o processo ou executar o evento RunWorkerCompleted para executar o que for necessário após o processo ter saído. Há uma outra pergunta. Sobre o BackgroundWorker cancelamento a solução para isso está usando um multi-threading iniciar adicionando: em seguida, olhar para o código abaixo: inicia um novo segmento que inicia o processo assim quando você chamar WaitForExit ele não freez o thread principal se você deseja executar Processo múltiplo de volta para trás é outro caso você precisará usar algo como uma lista de processo olhar para o código abaixo eu adicionar outro manualmente, mas você pode usar um loop por exemplo, então você vai iniciá-los embora o seu segmento eo processo 2 Irá esperar até o primeiro terminar sem bloquear a interface do usuário respondida Jul 5 13 at 17: 07Criar um processo de demônio em linguagem C com um programa de exemplo Um processo de daemon é um processo que é executado em segundo plano e não tem terminal de controle. Uma vez que um processo daemon geralmente não possui um terminal de controle, então quase nenhuma interação do usuário é necessária. Os processos Daemon são usados ​​para fornecer serviços que podem ser feitos em segundo plano sem qualquer interação do usuário. Por exemplo, um processo que é executado em segundo plano e observa a atividade de rede e registra qualquer comunicação suspeita pode ser desenvolvido como um processo de daemon. Daemon Process Design Um processo daemon pode ser desenvolvido como qualquer outro processo, mas há uma coisa que o diferencia com qualquer outro processo normal ou seja, não ter terminal de controle. Este é um aspecto de design importante na criação de um processo daemon. Isso pode ser conseguido por: Criar um processo normal (Processo pai) Criar um processo filho a partir do processo pai acima A hierarquia do processo nesta fase parece. TERMINAL - PROCESSO DE PADRES - PROCESSO DE CRIANÇA Terminar o processo pai. O processo infantil agora se torna órfão e é assumido pelo processo de inicialização. Chamar a função setsid () para executar o processo em uma nova sessão e ter um novo grupo. Após o passo acima, podemos dizer que agora esse processo se torna um processo daemon sem ter um terminal de controle. Altere o diretório de trabalho do processo daemon para raiz e feche os descritores de arquivo stdin, stdout e stderr. Deixe a lógica principal do processo do daemon ser executada. Então, vemos que os passos acima indicam os passos de design básicos para criar um daemon. Função C fork () Antes de criar um daemon de execução real seguindo as etapas de design acima mencionadas, vamos primeiro aprender um pouco sobre a chamada do sistema fork (). O sistema fork () cria um processo filho que é uma réplica exata do processo pai. Este novo processo é referido como o processo 8216child8217. Essa chamada do sistema é chamada uma vez (no processo pai), mas retorna duas vezes (uma vez no pai e na segunda vez na criança). Observe que após a chamada do sistema fork (), se o pai será executado primeiro ou a criança não é determinista. Ela depende puramente do mecanismo de mudança de contexto. Esta chamada retorna zero na criança enquanto retorna PID de processo filho no processo pai. Seguem-se alguns aspectos importantes desta chamada: A criança tem o seu próprio ID de processo exclusivo e este PID não coincide com o ID de qualquer grupo de processos existente. O ID do processo pai child8217s é o mesmo que o ID do processo do parent8217s. A criança não herda seus bloqueios de memória parent8217s. A utilização dos recursos do processo e os contadores de tempo da CPU são redefinidos para zero na criança. O conjunto de sinais pendentes child8217s está inicialmente vazio. A criança não herda ajustes de semáforo de seu pai. A criança não herdar bloqueios de registro de seu pai. A criança não herda timers de seu pai. O filho não herda pendentes operações de E / S assíncrono de seu pai, nem herdar quaisquer contextos de IO assíncrono de seu pai. Para obter mais informações, leia a página man desta chamada do sistema. A Implementação Baseado no projeto como mencionado na primeira seção. Aqui está a implementação completa: A seguir está o caminho pelo qual o código foi compilado e executado: Basta observar que o controle imediatamente voltou para o terminal ou seja, o daemon agora não está associado a qualquer terminal. Quando você verifica o arquivo log. txt localizado no diretório raiz, você pode ver que este processo do daemon está sendo executado.

No comments:

Post a Comment