IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques, systèmes et outils C Discussion :

Terminer proprement un processus avec kill


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Terminer proprement un processus avec kill
    bonjour,
    j'ai un processus fils qui tourne en tache de fond. Je dois le tuer a un moment donne depuis le processus pere avec l'instruction kill en utilisant SIGTERM.
    Le code du processus fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int fd = open(.....);  //ligne serie
    while(1)
    {
        //acquisition de donnees qui peuvent durer quelques ms
        write(fd, donnees);
        sleep(1);
    }
    close(fd);
    Je me pose la question: kill arrivant de facon totalement asynchrone, quelle garantie ai-je que mon processus fils se terminera correctement a la fin de son boulot et non pas au milieu d'une acquisition ou d'un write ou sans faire le close?
    Les pages de man ne sont pas tres explicite a ce sujet. (je trouve...)
    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    SIGTERM est un signal que tu peux intercepter, si tu le reçois tu peux «tranquillement» terminer proprement, ce n'est pas un SIGKILL.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 068
    Points
    43 068
    Par défaut
    La commande système kill envoi par défaut un SIGTERM au pid passé en paramètre (kill -9 pid enverra lui un SIGKILL).

    La fonction C kill envoie le signal de ton choix au processus de ton choix.

    Prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int kill(pid_t pid, int sig);
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par rdtech Voir le message
    Je me pose la question: kill arrivant de facon totalement asynchrone, quelle garantie ai-je que mon processus fils se terminera correctement a la fin de son boulot et non pas au milieu d'une acquisition ou d'un write ou sans faire le close?
    Les pages de man ne sont pas tres explicite a ce sujet. (je trouve...)
    Merci.
    À noter que la réception d'un signal, même intercepté à l'aide de signal() ou sigaction(), provoque en principe l'échec de l'appel système en cours qui ressort immédiatement (s'il n'est pas coincé dans un sommeil ininterruptible « D ») avec le code d'erreur approprié.

    Normalement, un programme bien écrit ne devrait pas avoir besoin de s'en soucier, puisque la réception de ce signal est une cause d'échec comme une autre, causes qui doivent normalement être prises en charge de façon générale sans cibler un contexte particulier. Par contre, il est intéressant de savoir que cela va provoquer le retour prématuré de « sleep() », par exemple, dont on pourrait légitimement penser qu'il ne peut échouer. Cela va aussi être le cas en cas de lecture de l'entrée standard avec fgetc() ou autre. Quand on s'en sert pour lire par défaut le clavier de l'utilisateur, il faut garder à l'esprit qu'elle peut échouer comme la lecture d'un fichier et traiter EOF proprement (chose normalement systématique avec les fichiers, et nécessaire si l'on veut pouvoir sortir avec Ctrl+D).

    Il est important de remarquer que dans la quasi-majorité des cas, à part avec SIGCHLD et SIGURG (et SIGWINCH sur BSD et Sun, selon la man page), un signal reçu tue le processus s'il n'est pas dûment intercepté. Les signaux ignorés par défaut, eux, le sont totalement et n'interrompent donc pas les appels systèmes en cours SAUF s'ils sont justement interceptés car il faut bien donner la main au handler du signal. Donc, dans les deux cas (Kill ou Ign), un signal intercepté fera quand même échouer l'appel système en cours. Si le processus est purement en mode user (en train d'exécuter des tâches dans son propre segment, par exemple en traitant ses données uniquement avec des pointeurs), la réception d'un signal intercepté n'a pas d'incidence a priori.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Il est cependant possible de ne pas avoir cette interruption d'un appel système.
    En créant un thread dédié, et en masquant tous les signaux gênant sur les autres threads. Quand le signal survient il interrompra le thread dédié et pour les autres il n'y aura pas d'interruption.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void handler(int leSignal){
    }
    int thread_appat( void* prm )  {
      sigset_t masque;
      sigemptyset( &masque );
      sigprocmask( SIG_SETMASK , &masque , NULL );
     
      struct sigaction pourSignal = { 0 };
      pourSignal.sa_handler = &handler;
      sigaction( SIGTERM , &pourSignal , NULL );
     
      for(;;)
         pause(); // pause sera interrompu, puis se remettra en attente
    }
    Bien sûr le handler du signal doit avoir été mis en place et cela ne fonctionne pas pour les trois signaux non interceptables (SIGKILL, SIGCONT et SIGSTOP).

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Merci à tous,
    vos réponses sont dans mes notes persos.
    Des fois je vous trouve encore plus pointus que les pages de man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Utiliser exec() avec kill
    Par lepec dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2007, 18h53
  2. Réponses: 1
    Dernier message: 03/12/2006, 10h16
  3. Réponses: 5
    Dernier message: 16/12/2005, 17h41
  4. Comment stocker PROPREMENT "\\" dans mysql avec p
    Par jcachico dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 03/12/2005, 14h32
  5. Lancement de processus avec priorité
    Par GMI3 dans le forum Administration système
    Réponses: 2
    Dernier message: 14/06/2004, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo