Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

206
Visualizações
C ++ ¿En qué se llama la devolución de llamada de señal de subproceso?

Necesito ejecutar una limpieza antes de salir del servicio al finalizar (por Linux systemctl stop my-srv

Se me ocurrieron hasta ahora con 2 soluciones:

 void signal_callback(int code) { _exit(0); } . . . void main.. { signal(SIGTERM, signal_callback) fgetc(stdin); // wait for signal }

¿En qué subproceso se llama la devolución de signal_callback ? ¿Será el mismo hilo que registró la devolución de llamada? Quiero decir, si llamo a signal en el hilo principal y luego llamo a exit en signal_callback , ¿la aplicación terminará correctamente?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

¿En qué subproceso se llama la devolución de llamada_señal?

Depende de cómo envíes la señal.

  • Si envía una señal usando raise , la devolución de llamada se llamará en el mismo hilo.
  • Si envía una señal usando pthread_kill , entonces la devolución de llamada de la señal se llamará en el subproceso cuya identificación se pasó a pthread_kill .
  • Si envía una señal usando kill , creo que es mejor citar documentación:

    POSIX.1 requiere que si un proceso se envía una señal a sí mismo, y el subproceso de envío no tiene la señal bloqueada, y ningún otro subproceso la tiene desbloqueada o la está esperando en sigwait(3), al menos una señal desbloqueada debe ser entregado al subproceso de envío antes de que kill() regrese.

Habrá diferencias si

si... llamo a exit en signal_callback, ¿la aplicación terminará correctamente?

No, exit no es una función segura asíncrona. No está bien llamarlo desde un controlador de señal.

Con respecto a la edición: _exit es asíncrono seguro, por lo que puede llamarlo. Pero no llamará a las funciones de limpieza registradas, ni se desenrollará la pila, por lo que no lo describiría como "elegante" como tal.


PS main debe devolver int .

over 4 years ago · Santiago Trujillo Relatório

0

Por defecto, las señales se envían al proceso ; no a ningún subproceso específico que pueda tener ese proceso. Si hay varios subprocesos, los estándares no especifican qué subproceso maneja la(s) señal(es).

Por supuesto, puede enmascarar las señales para que ciertos subprocesos no las reciban o que solo un subproceso específico maneje las señales. Consulte pthread_sigmask para Linux.

si llamo a signal en el hilo principal y luego llamo a exit en signal_callback, ¿la aplicación terminará correctamente?

Lo que significa "con gracia" depende de su programa. Si configura un controlador de señal como lo ha hecho, simplemente saldrá al recibir la señal. Si el proceso muere limpiamente depende de lo que estaba haciendo cuando recibió la señal, por ejemplo, si se necesita alguna acción de limpieza, si se deben liberar recursos (los que no se liberan automáticamente al salir), etc.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda