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

POSIX C Discussion :

[C system] timeout sur un processus


Sujet :

POSIX C

  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut [C system] timeout sur un processus
    Bonjour

    Voulant me remettre au C, je me suis fixé ce petit projet : créer une commande timeout qui prend un temps en secondes et une commande shell. Si au bout de ce temps t la commande n'est pas terminée, elle est tuée.
    A priori, tout va bien dans mon code, aucune erreur à la compilation avec gcc v4.0.3 sous Ubuntu 6.06 x86. Mais à L'exécution, malgré le temps donné, la commande ne se fait pas tuer.
    Voici la partie de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    pid = fork();
    	if(pid<0){
    		fprintf(stderr, "Fork error : %d\n", pid);
    		exit(pid);
    	}
    	if(pid==0){
    		t = time(NULL);
    		while(t-start < delay[0]){
    			execvp(command[0], command);
    			t = time(NULL);
    		}
    		kill(pid, SIGKILL);
    		fprintf(stdout, "Timeout.\n");
    		exit(EXIT_SUCCESS);
     
    	}
    	else{
    		retour = waitpid(pid, &status, 0);
    		if(retour < 0){
    			exit(EXIT_SUCCESS);
    		}	
    	}
    Peut être que l'utilisation du while n'était pas une bonne idée ?

    Merci d'avance de vos conseils.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Primo, j'espere pour toi que start est initialise .

    Deuxiemement, le decoupage n'est pas bon.

    La fonction execvp(3) lance l'execution d'une autre commande, ce qui fait que tout le code present par la suite ne sera jamais execute.

    A mon avis ca devrait plus ressembler a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    pid = fork();
    if (pid < 0)
      {
        /* traitement de l'erreur */
      }
    else if (pid == 0)
      {
        /* execvp ici */
      }
    else
      {
        /* attente de la fin du timeout ou de la mort du processus */
        /* kill du processus si timeout ecoule */
      }

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut
    Hello Jack

    Merci de ta réponse.
    Ok, je vais tâcher de modifier mon code en ce sens. Ce qui me semble bizarre, c'est que j'avais placé initialement ma boucle while dans le traitement du processus du père.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    pid = fork();
    	if(pid<0){
    		fprintf(stderr, "Fork error : %d\n", pid);
    		exit(pid);
    	}
    	if(pid==0){
    		execvp(command[0], command);
    	}
    	else{
    t = time(NULL);
    		while(t-start < delay[0]){
    		retour = waitpid(pid, &status, 0);
    		if(retour < 0){
    			exit(EXIT_SUCCESS);
    		}	
    			t = time(NULL);
    		}
    		kill(pid, SIGKILL);
    		fprintf(stdout, "Timeout.\n");
    		exit(EXIT_SUCCESS);
    	}
    Or, même avec ce code, le fils ne mourrait pas lorsque le timeout est atteint. Mais peut être me suis-je encore planté (sans doute !). Une précision, le processus fils s'exécute bien.

    Merci encore de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Salut

    Citation Envoyé par GLDavid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t = time(NULL);
    while(t-start < delay[0]){
    ça ne serais pas plutot :

  5. #5
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    pid = fork();
    	if(pid<0){
    		fprintf(stderr, "Fork error : %d\n", pid);
    		exit(pid);
    	}
    	if(pid==0){
    		execvp(command[0], command);
    	}
    	else{
                              t = time(NULL);
    		while(t-start < delay[0]){
    		   retour = waitpid(pid, &status, 0);
    		   if(retour < 0){
    			exit(EXIT_SUCCESS);
    		   }	
    		  t = time(NULL);
    	            }    
    	          kill(pid, SIGKILL);
    		fprintf(stdout, "Timeout.\n");
    		exit(EXIT_SUCCESS);
    	}
    Je ne comprends pas bien ton code: si tu entres dans le while, tu n'en sortiras pas tant que le fils ne s'est pas terminé (waitpid() attend la fin du fils). Donc tu n'exécuteras jamais ton kill()....
    Ou alors, je suis mal réveillée...

  6. #6
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut
    Citation Envoyé par gege2061
    Salut


    ça ne serais pas plutot :
    Salut Gégé

    Le start est initialisé avant, donc pas de souci à ce niveau là.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par GLDavid
    Le start est initialisé avant, donc pas de souci à ce niveau là.
    Ok, j'espère pour toi que le temps entre les deux n'est pas supérieur au timeout

    Voici une autre manière d'implémenter un timeout : Tuer processus fils

  8. #8
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    waitpid(pid, &status, 0);
    Le problème vient de là, tu attends la fin du fils histoire de voir si il ne se termine pas avant le timer, c'est bien mais cet appel est bloquant donc ton programme ne fera qu'attendre la fin du fils et le timer n'existera pas.

    Tu as une solution, qui consiste à rendre l'appel non bloquant (en mettant le troisième paramètre à WNOHANG)

    Autre chose, pourquoi ne passes tu pas par un signal (SIGALRM) ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/10/2009, 17h46
  2. Timeout sur system()
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2007, 12h37
  3. Agir à distance sur les processus des utilisateurs
    Par kuranes dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 11/10/2005, 10h18
  4. [Système] Droits sur un fichier
    Par maxvador dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 16/07/2004, 17h06
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

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