Daemon wakeup via clock

0

Estou escrevendo um daemon (meu primeiro) e ele precisa acordar a cada segundo e verificar uma peça especial de hardware. Eu tenho que verificar o hardware, mas como eu faço isso dormir, então acorde em um segundo específico?

Gostaria de anexar o relógio de alguma forma e acordar usando algum tipo de interrupção. A pesquisa está fora de questão, pois não quero gastar os recursos do computador quando ocioso.

  • Pascal
  • Ubuntu Server 10.10
  • Não OOP
por Cool Javelin 22.12.2011 / 08:49

3 respostas

1

OK, bem, aqui está a solução que eu criei. Um pouco de dor, mas ...

Primeiro, quando estou pronto para esperar o próximo segundo, recebo o MilliSecond atual. Esta é a melhor resolução que posso obter do sistema.

Então, eu subtraio isso de 1000 (1000 Ms por segundo) menos a Ms atual é igual ao número de Ms que eu preciso esperar.

Em seguida, multiplique por 1 milhão (para converter em NanoSeconds)

Em seguida, use NanoSleep (blah, blah).

Isso parece funcionar.

PS, comparei o uso da CPU (com o topo) entre esse método e um que simplesmente pesquisa esperando pelo próximo segundo para chegar, e a versão de pesquisa usa 98% da CPU, e isso usa 0.3%. Este é o caminho.

    
por Cool Javelin 07.01.2012 / 10:25
0

Em um lugar, você diz que quer pesquisar em um determinado segundo. Em outro lugar, você diz que quer pesquisar a cada segundo. Qual é?

Eu acho que a maneira mais fácil seria agendá-lo no loop do programa [1]. Eu não sei Pascal, mas com certeza tem algum tipo de função do sono.

Veja alguns pseudocódigos para lhe dar a ideia:

while(true) {
    check_hardware()
    sleep(1) //unit is seconds
}

Se você deseja executar apenas alguns segundos específicos, basta adicionar uma verificação para o segundo:

while(true) {
    if(get_time_as_seconds() in allowable_seconds()) {
        check_hardware()
    }
    sleep(1)
}

[1]: no seu daemon, isso é.

    
por Scott Severance 22.12.2011 / 09:33
0

Veja as chamadas% system_% e alarm , bem como SIGALRM . Eu não tenho ideia de como fazer isso em Pascal, mas presumivelmente será semelhante.

man 2 alarm
man 3 sleep

Você pode achar que pause é mais que suficiente para suas necessidades. De fato, a documentação diz que isso pode até ser implementado usando sleep (embora eu acredite que não no Linux).

Note que todas essas coisas não garantem exatamente quando você acorda. Os tempos indicados são aproximados. Um alarme não será entregue antes do horário determinado, mas pode ser entregue um pouco atrasado . O sono tem um problema semelhante, mas também pode retornar mais cedo se o processo receber outro sinal.

    
por ams 22.12.2011 / 14:40