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

C Discussion :

Executer une commande en a shell arriere plan


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique Loraine
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Informatique Loraine
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Executer une commande en a shell arriere plan
    Bonjour,
    je doit créer un mini shell et une question me pose soucis. Voilà mon énoncé :

    Le shell va maintenant gérer les commandes en arrière-plan. Dans ce cas,
    le shell n’attend pas la fin de la commande mais "continue" en permettant la
    saisie d’une nouvelle commande. Cependant, il faut également gérer la fin des
    processus lancés en arrière-plan. Lorsqu’un processus se termine, le signal
    SIGCHLD est envoyé à son père : il faudra donc le gérer correctement de manière
    à éliminer les processus zombies. Indice : waitpid(2).
    Pour les commandes lancés en arrière-plan, si l’entrée standard n’est pas
    redirigée vers un fichier, il faudra la rediriger vers le fichier /dev/null.

    j'ai déjà créé un handler pour mon Sigchld qui s'occupe de terminer un programme dès qu'il est fini. Mais mon soucis c'est de lancer le programme en arrière plan c'est-à-dire quand je fais exevp d'une commande la lancer en arrière plan et que mon mini-shell continue a bosser sur une autre commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void handSIGCHLD (int sig){
    				pid_t pid = getpid();
    				int status;
    				fprintf(stderr,"hello");
    				 if ((pid = wait(&status)) == -1){ /* suppression du fils zombi */
            			 perror("wait handler ");
             			return ;
        			}
        	return;
    }
    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
     struct sigaction action_termine;
            sigemptyset(&action_termine.sa_mask);
            action_termine.sa_handler= handSIGCHLD;
            sigaction(SIGCHLD,&action_termine,NULL);
            execvp(li.cmds[i].args[0],li.cmds[i].args);
            fprintf(stderr, "ERROR !\nCommand %s: not exist !\n",li.cmds[i].args[0] );
            perror(li.cmds[i].args[0]);
            line_reset(&li);
            exit(1);
          }else if (pID < 0){
            line_reset(&li);
            perror("fork");
            exit(1);
          }//sigchl wiat pid en question tache finies
          wait(&status);
          if(WIFEXITED (status)){
            fprintf (stderr, "Child over usally: status = %d\n",WEXITSTATUS (status)) ;
          } else if (WIFSIGNALED (status)){
            fprintf(stderr, "Child over with a signal\n");
          }
          fprintf(stderr, "\n");
       }

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mocos Voir le message
    mais mon soucis c'est de lancer le programme en arrière plan c'est a dire quand je fais exevp d'une commande la lancer a arriere plan et que mon mini-shell continue a bosser sur une autre commande
    Bonjour
    Je présume que tu fais un fork() et que c'est le fils qui lance ton execvp. Ben quand la commande n'est pas lancée en arrière plan le père attend la fin du fils (waitpid) mais quand la commande est lancée en arrière plan, le père n'attend pas la fin du fils pour repartir à attendre une autre commande...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique Loraine
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Informatique Loraine
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Reponse
    Merci ! , Du coup j'ai un peu compris j'ai modifie comme telle : si l'utilisateur decide que la commande sois en arrière plan alors le programme principal continue son fonctionnement sans attendre le statue de terminaison et c'est donc le SigCHld qui va finir le programme fils lancé mais j'ai un soucis avec ma structure action ( le programme est dans une boucle infini for ) et mon handler et t'il juste ou waitpid() ici est plus judicieux ?
    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
      struct sigaction action_termine;
    				execvp(li.cmds[i].args[0],li.cmds[i].args);
     
    				fprintf(stderr, "ERROR !\nCommand %s: not exist !\n",li.cmds[i].args[0] );
    				perror(li.cmds[i].args[0]);
    				exit(1);
    			} else if (pID < 0){
    				perror("fork");
    				exit(1);
    			}
    			if(li.background){
    				wait(&status);
    				}else{
    					action_termine.sa_handler= handSIGCHLD;
    					sigaction(SIGCHLD,&action_termine,NULL);
    				}

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mocos Voir le message
    mais j'ai un soucis avec ma structure action ( le programme est dans une boucle infini for ) et mon handler et t'il juste ou waitpid() ici est plus judicieux ?
    Ben ça fait longtemps que j'ai quitté le monde du système et je connais pas sigaction (je presume que c'est une espèce de signal() plus perfectionné). Mais en revanche, waitpid() n'est pas le bon outil. En effet, cette fonction attend la fin d'un processus précis. Or, si tu as plusieurs processus lancés en arrière plan, tu ne sais pas lequel se terminera le premier. En fait, plus généralement, tu n'as même pas besoin d'attendre le processus (c'est justement le but du processus lancé en background => ne pas avoir à attendre sa fin).
    Te suffit juste d'armer une fonction dédiée sur SIGCHLD et dès qu'un processus en arrière plan se termine, le père reçoit ce signal et va se brancher sur la fonction dédiée pour gérer ce fils qui se termine.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/09/2008, 20h22
  2. executer une commande shell en c++
    Par robux dans le forum Linux
    Réponses: 4
    Dernier message: 25/09/2007, 18h01
  3. [C] code pour executer une commande shell
    Par waldoun dans le forum Linux
    Réponses: 3
    Dernier message: 05/05/2007, 22h41
  4. execute une commande shell en java
    Par freakfm dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 07/10/2006, 17h03

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