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èque standard C Discussion :

[Linux] attendre la fin d'execution d'un process en C


Sujet :

Bibliothèque standard C

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut [Linux] attendre la fin d'execution d'un process en C
    Bonjour.
    J'ai une application qui doit,à partir d'un pid, stopper un processus et attendre qu'il soit terminé. Si j'ai bien compris waitpid marche uniquement si le pid est celui d'un processus enfant. Ce cas correspond à tous les exemple que j'ai trouvé sur le net..

    • Comment faire si le processus n'est pas un enfant? J'ai réussi à faire quelque chose en utilisant kill(pid,0) (teste l’existence du pid) et une boucle mais je ne sais pas si c'est la bonne méthode.
    • Si le pid correspond à processus enfant, es ce préférable d'utiliser wait ou alors utiliser kill(pid,0) est possible si je gère le signal SIGCHLD?
    • Y a t-il une méthode particulière pour savoir si le pid correspond à un process enfant?


    En gros je cherche à faire une fonction qui pour n'importe quel PID (enfant ou non) :
    1- envoie d'un SIGTERM
    2- attend la fin du processus.
    3- si au bout de 2 secondes le processus n'est pas terminé : envoie d'un SIGKILL



    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 401
    Points : 23 783
    Points
    23 783
    Par défaut
    Bonjour,

    Ce n'est pas simple. À ma connaissance, il n'y a pas d'appel système dédié pour faire cela dans le contexte dans lequel tu te places. Par ailleurs, les appels wait() et dérivés sont faits non seulement pour attendre la fin d'un processus fils mais également pour indiquer au système que le père en a fait le deuil et donc, surtout, que le processus défunt peut quitter l'état zombie Z pour passer définitivement à la postérité. Donc, si tu as un processus enfant, il est important d'utiliser wait() pour cette raison.

    Pour pouvoir prendre le contrôle sur un processus quelconque, tu peux utiliser ptrace(), qui sert en principe aux debuggers. Ça te permettra d'accéder à pas mal d'infos et de gérer les signaux. L'appel est standard UNIX mais les méta-infos du processus sont spécifiques à chaque système et peuvent varier sans préavis. Autre inconvénient sérieux : le processus ne doit pas être déjà suivi (par un autre processus comme le tien ou par un débogueur légitime).

    En dehors de cela, la manière « normale » de traiter ces cas consiste à parser le contenu de « /proc », qui sert à ça. C'est ce que font les commandes shell comme ps (un coup de strace dessus pour s'en convaincre). Ce n'est pas simple mais « man proc » est bien documenté. Pour savoir si un processus est un fils ou d'une manière générale un lointain descendant, tu peux récupérer son PPID depuis /proc/n/stat et remonter récursivement jusqu'à rencontrer soit ton propre PID, soit 0 (les processus sans père ont un PPID nul dans stat, même si en pratique ils sont traités comme s'ils étaient rattachés à init). Sous Linux en particulier, tu peux utiliser inotify pour surveiller l'existence du répertoire correspondant au processus dans /proc. Quand il disparaît, le processus a cessé d'exister.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Merci beaucoup pour les éclaircissements.
    Effectivement si je kill un process qui tombe en zombie, je suis bloqué. En vérifiant l’état du pid avec le fichier status je résout ce cas.


    yan

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

Discussions similaires

  1. Ne pas attendre la fin d'execution d'une méthode
    Par w3blogfr dans le forum Langage
    Réponses: 1
    Dernier message: 05/03/2010, 16h08
  2. attendre la fin d'execution d'une simulation
    Par ABN84 dans le forum Simulink
    Réponses: 1
    Dernier message: 26/11/2009, 08h18
  3. Réponses: 4
    Dernier message: 24/01/2007, 00h48
  4. [Batch] attendre fin d'execution d'un msi
    Par meda dans le forum Windows
    Réponses: 2
    Dernier message: 06/12/2006, 14h55
  5. [Système] Lancer un executable sans attendre la fin
    Par raptor70 dans le forum Langage
    Réponses: 1
    Dernier message: 27/10/2005, 14h25

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