daemon
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
— | daemon [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Daemons (serviços) ====== | ||
+ | |||
+ | |||
+ | ===== Conceito de daemon ===== | ||
+ | Em várias situações precisa-se que um processo fique em execução continuamente (// | ||
+ | |||
+ | Geralmente são programas que são iniciados assim que o sistema operacional é inicializado. Coloca-se a chamada dos '' | ||
+ | |||
+ | |||
+ | ===== Regras de codificação ===== | ||
+ | |||
+ | Para se codificar um daemon deve-se realizar uma série de tarefas e chamadas de funções para que o processo se comporte como um '' | ||
+ | |||
+ | * A primeira coisa a fazer no processo é chamar a função [[fork]] para duplicar o processo atual e terminar o processo pai. Assim, o término do processo pai libera o shell, pois o mesmo acha que o comando terminou. O processo filho herda o Process Group ID do pai mas cria um novo Process ID, garantindo que este processo não será um processo líder de grupo. | ||
+ | * Deve-se chamar a função [[setsid]] para criar uma nova sessão. Com a criação de uma nova sessão, o processo filho torna-se o líder da sessão, torna-se o líder do grupo de processos e não irá possuir um terminal de controle. | ||
+ | * Em sistemas baseados no Unix //System V//, deve-se realizar o [[fork]] novamente, pois algum evento futuro poderá ligar um terminal ao processo '' | ||
+ | * Deve-se trocar o diretório atual para o diretório raiz ou para um diretório específico. Este diretório preferencialmente não deve ser um diretório montado depois do processo de boot. | ||
+ | * Deve-se mudar a máscara de criação do processo para **'' | ||
+ | * Todos os descritores de arquivos que não serão utilizados pelo processo '' | ||
+ | * Deve-se associar a '' | ||
+ | * Caso durante a vida do processo daemon ele precise ler algum arquivo de configuração ou mudar sua configuração interna, deve-se instalar um [[sinal|signal handler]] para o [[sinal|sinal SIGHUP]], pois como o processo está desconectado de qualquer terminal ele naturalmente nunca receberá este sinal do sistema operacional. | ||
+ | |||
+ | ===== Funções ===== | ||
+ | * [[setsid]] | ||
+ | * [[syslog]] | ||
+ | |||
+ | |||
+ | ===== Exemplo completo ===== | ||
+ | |||
+ | <code c> | ||
+ | /* daemon.c */ | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | |||
+ | int daemon_init (void) | ||
+ | { | ||
+ | pid_t iPid; | ||
+ | long iMaxFd; | ||
+ | int i, fd0, fd1, fd2; | ||
+ | | ||
+ | |||
+ | /* 1. passo - duplicar o processo usando o fork */ | ||
+ | | ||
+ | { | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | | ||
+ | { | ||
+ | exit(0); | ||
+ | } | ||
+ | |||
+ | /* 2. passo - chamar a função setsid para criar uma nova sessão de processo, | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | /* 3. passo - é necessário realizar 2 forks para evitar | ||
+ | que o shell ligue um terminal ao processo. Também é | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | { | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | | ||
+ | { | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | | ||
+ | { | ||
+ | exit(0); | ||
+ | } | ||
+ | |||
+ | /* 4. passo - troca-se o diretório atual para a raiz do sistema ou para um diretorio do | ||
+ | próprio daemon */ | ||
+ | | ||
+ | |||
+ | /* 5. passo - inicializa a máscara padrão de criação de arquivos */ | ||
+ | | ||
+ | |||
+ | /* 6. passo - fechando todos os descritores de arquivos existentes no | ||
+ | sistema. Utiliza-se a informação de número máximo de descritores configurado | ||
+ | no sistema e obtido com a função sysconf. */ | ||
+ | | ||
+ | for (i=0; i < iMaxFd; i++) | ||
+ | { | ||
+ | close (i); | ||
+ | } | ||
+ | |||
+ | /* 7. passo - abrindo arquivos de entrada padrao, saida padrao e saida de erro para /dev/null */ | ||
+ | fd0 = open("/ | ||
+ | fd1 = dup(0); | ||
+ | fd2 = dup(0); | ||
+ | |||
+ | /* abrindo a log */ | ||
+ | | ||
+ | |||
+ | if( fd0 != 0 || fd1 != 1 || fd2 != 2 ) | ||
+ | { | ||
+ | syslog(LOG_ERR, | ||
+ | } | ||
+ | |||
+ | |||
+ | | ||
+ | } | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | int i; | ||
+ | | ||
+ | |||
+ | | ||
+ | { | ||
+ | syslog(LOG_NOTICE, | ||
+ | sleep(1); | ||
+ | } | ||
+ | |||
+ | | ||
+ | } | ||
+ | </ | ||
daemon.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1