Simple Linux De Traitement De Signal

J'ai un programme qui crée de nombreux fils et s'exécute jusqu'à ce que l'alimentation est l'arrêt de l'ordinateur, ou si l'utilisateur utilise kill ou ctrlc pour terminer le processus.

Voici un peu de code et comment le main() regarde.

static int terminate = 0;  //does this need to be volatile?

static void sighandler(int signum) { terminate = 1; }

int main() {
  signal(SIGINT, sighandler);
  //...
  //create objects, spawn threads + allocate dynamic memory
  //...
  while (!terminate) sleep(2);
  //...
  //clean up memory, close threads, etc.
  //...
  signal(SIGINT, SIG_DFL);  //is this necessary?
}

Je me demandais un peu les choses:

  1. Est un signal de manutention nécessaires?

    J'ai lu dans ce fil "Linux C capture de signal kill pour un arrêt progressif", qui, apparemment, le système d'exploitation de la poignée de nettoyage pour moi.
    Donc, puis-je remplacer le gestionnaire de signal avec juste une boucle infinie et de laisser l'OS gracieusement sortie le fils, de-allouer de la mémoire, etc?

  2. Il d'autres signaux que j'ai besoin d'être concernés par un sujet propre à la résiliation? Ce fil "Comment ne SIGINT se rapportent à l'autre de la résiliation des signaux?", a été utile à la liste de tous les signaux que j'ai peut-être concerné, mais combien réellement nécessaire de manutention?

  3. Ne le résilier variable dans mon exemple être volatile? J'ai vu de nombreux exemples où cette variable est volatile, et d'autres où elle ne l'est pas.

  4. J'ai lu que signal() est maintenant obsolète, et d'utiliser sigaction(). Sont-il vraiment de bons exemples pour montrer comment convertir de la précédente signal() appel? Je vais avoir des ennuis avec la nouvelle structure que j'ai créer/transmettre et comment il s'adapte à tous ensemble.

  5. Est le deuxième appel à signal() nécessaire?

    Est-il quelque chose de similaire que j'ai besoin d'être concernés, avec pour sigaction()?

Pour être clair, tout ce que je suis en train d'accomplir pour avoir mon: boucle principale d'exécuter jusqu'à ce que ctrlc ou d'alimentation est débranché ou quelque chose de vraiment mauvais.

  • À propos de les nettoyer, il est à nettoyer que le système ne peut pas le faire. Un exemple est si vous communiquent via un port série, alors vous pourriez avoir besoin d'envoyer un "au revoir" message pour dire à l'autre extrémité vous allez loin.
  • Oui, mais n'est-ce pas un peu une méthode peu fiable de dire à l'autre fin que j'ai disparu? Par exemple, si SIGKILL frappe le processus, il n'y a rien que je peux faire ou pas de gestionnaire que je peux mettre en place, car aucun gestionnaire peut être mappé à un SIGKILL... Pour certaines applications, mais je peux voir pourquoi c'est utile. Pour le mien, j'ai juste besoin de faire mémoire de l'allocation et de la fermeture de certains threads.
  • Vous n'êtes pas obligé de faire de signal handeling, mais il peut être très ennuyeux, si vous avez un 5 étape 10 minutes par pas de programme de calcul par exemple. L'utilisateur peut accidentellement tuer le programme. Si un signal handeling pourrait enregistrer les résultats intermédiaires à partir des étapes 1 à 4, lorsqu'il est tué.
  • qui vous suggérons d'appeler signal(SIGINT, SIG_DFL); dans main()? de référence ?
InformationsquelleAutor It'sPete | 2013-07-30