Você deve definir seu manipulador de sinal usando sigaction (2) em vez de signal (2) , e defina SA_RESTART
em sa_flags
se você não quiser para interromper uma chamada de sistema de bloqueio.
struct sigaction sa;
sa.sa_handler = your_handler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, 0);
Ou, melhor ainda, apenas manipule a interrupção você mesmo.
Se nanosleep (), etc. retornou -1, verifique se errno == EINTR
, imprima o progresso e refaça a chamada (sleep () é apenas um invólucro para nanosleep () no linux). Você terá que fazer isso de qualquer maneira se o seu programa crescer para algo mais complexo - não há muito o que fazer com segurança de um manipulador de sinais - veja a página do manual signal-safety (7) no Linux.