Que método eu uso para gerenciar um processo em segundo plano específico do aplicativo?

2

Estou desenvolvendo um aplicativo com comportamento diferente, dependendo dos argumentos:

  • "- config" inicia uma janela Gtk para alterar opções, iniciar e fechar o daemon.
  • "- daemon" inicia um processo em segundo plano que faz algo a cada X minutos.

Eu já sei usar fork / system / exec etc ...

Mas gostaria de saber a lógica principal de tal aplicativo para:

  • reinicie ou atualize o daemon quando a configuração for alterada.
  • mantém apenas uma instância do daemon.

Eu li que matar o daemon para reiniciá-lo não é uma maneira limpa de fazer. Como outras aplicações fazem? (ubuntuone, previsão do tempo, feed RSS trabalhando com a área de notificação)

Obrigado pela sua ajuda.

PS: Eu não quero criar um daemon de todo o sistema, apenas um aplicativo de usuário com um processo em segundo plano.

    
por Simon Dubois 11.09.2012 / 11:12

2 respostas

2

Você está tocando aqui em um oceano de informações. O problema é chamado comunicação entre processos (IPC) e há toneladas de materiais, dependendo da sua linguagem de programação, necessidade de complexidade, etc. Varia de comunicação através de arquivos (presença ou ausência de um arquivo de bloqueio é uma variante simples de isso), através de pipes nomeados para o Sys V IPC, incluindo semáforos e memória compartilhada.

No seu caso, eu procuraria por pipes nomeados.

    
por January 11.09.2012 / 11:20
3

Considere descarregar a notificação no sistema!

A maneira geral com que as coisas se comunicam com um daemon na moderna área de trabalho GNU / Linux é D-Bus . Para simplificar grosseiramente o que ele faz: O D-Bus permite chamar funções de um processo de "serviço" de daemon. Você poderia facilmente ter apenas uma função refreshConfig() que recarrega a configuração do arquivo na chamada.

Dito isto, a coisa específica que você está tentando fazer tem uma solução mais voltada para o Ubuntu e o GTK +. Com as GSettings , você cria um esquema de configuração que define os pares chave / valor que você está interessado em armazenar. Depois de fazer isso, você pode colocar uma linha como esta no seu daemon ...

mySettings->connect("changed::setting", onSettingChanged);

E o GObject irá ativar seu daemon e chamar onSettingChanged() quando qualquer configuração for alterada. Essa função pode chamar uma nova instância de si mesmo e exit(0) , se desejar. Embora eu não consiga pensar em uma lógica lógica de código, por que você precisa fazer isso.

Aqui está um excelente guia para usar GSettings with Python . Deve ser facilmente traduzível para C ++.

    
por Jjed 11.09.2012 / 17:18