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 :

[Prog système] Un programme s'exécute 3 secondes après un autre


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 165
    Points : 59
    Points
    59
    Par défaut [Prog système] Un programme s'exécute 3 secondes après un autre
    Bonjour,

    je veux exécuter 2 programmes via mon programme. Le premier va s'exécuter lors d'un clic CTRL-C et le deuxième après 3 secondes du clic à l'aide de la fonction alarm().

    Le problème est qu'après 3 secondes, le premier programme reste en exécution et le deuxième ne se déclenche pas.

    Voilà mon programme :

    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
    24
    25
    26
    27
    char *fe,*fifo,*fs;
    void prog1(int sig) {
        if(sig == SIGINT) {
    	alarm(3);
    	printf("Exécution du prog1\n");
    	execlp("./prog1","./prog1",fe,fifo,NULL);
        }
    }
    void prog2(int sig) {
        if(sig == SIGALRM) {
    	printf("Exécution du prog2\n");
    	execlp("./prog2","./prog2",fifo,fs,NULL);
    	exit(0);
        }
    }
    main(int argc, char * argv[])
    {
    if(argc!=4){printf("No args");exit(1);}
     
    fe=argv[1];
    fifo=argv[2];
    fs=argv[3];
     
    signal(SIGINT,prog1);
    signal(SIGALRM,prog2);
    while(1) {}
    }
    Merci pr vos renseignements.

  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 699
    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 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Salut
    Ton truc est pas mal, il m'a même amusé
    Toutefois tu as oublié une seule chose: c'est que le execlp() (et tous ses clones de la famille des exec...) recouvre/remplace ton processus par le nouveau processus. Et donc lorsque le programme 1 se lance, le programme d'origine disparait et donc ne peut plus appeler le programme 2.

    Voici une modification possible

    Code c : 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
    void prog1(int sig) {
    		if(sig == SIGINT) {
    			if (fork() == 0)
    			{
    				printf("Exécution du prog1\n");
    				execlp("./prog1","./prog1",fe,fifo,NULL);
    			}
    			else
    				alarm(3);
    	}
    }
    void prog2(int sig) {
    		if(sig == SIGALRM) {
    			if (fork() == 0)
    			{
    				printf("Exécution du prog2\n");
    				execlp("./prog2","./prog2",fifo,fs,NULL);
    			}
    			// else
    				exit(0);
    	}
    }

    PS: j'ai mis le second else en commentaire pour que le exit(0) soit exécuté aussi dans le fils parce que, bizarrement, quand je ne le mets que pour le père, le processus ayant initié pgm2 reste actif malgré le execlp()...
    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
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 165
    Points : 59
    Points
    59
    Par défaut
    Merci bien Sve@r. ça marche maintenant.

    L'étape que j'ai pas compris, c'est après la création du premier processus fils. Pourquoi "else alarm(3);".

    Pourquoi on peut pas faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(fork()==0) {...} wait(0); alarm(3);

  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 699
    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 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par af.zakaria Voir le message
    L'étape que j'ai pas compris, c'est après la création du premier processus fils. Pourquoi "else alarm(3);".
    Parce que seul le père a besoin de programmer une alarm() puisque c'est lui qui devra ensuite appeler prog2.
    Le fils, lui, exécute son prog1 et disparait.

    C'est aussi la raison pour laquelle j'avais mis au départ else exit(0). Parce que seul le père a besoin de se terminer, le fils se terminant normalement avec le execlp("./prog2", ...). Toutefois, comme je l'ai dit, cela ne fonctionne pas tout à fait...

    Citation Envoyé par af.zakaria Voir le message
    Pourquoi on peut pas faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(fork()==0) {...} wait(0); alarm(3);
    Dans ce cas là, le code wait(0); alarm(3); sera aussi exécuté par le fils ce qui est totalement inutile. Ou, plus exactement, le fils ayant remplacé son code par celui de prog1, ce wait(0); alarm(3); ne sera pas traité par le fils ce qui est non seulement inutile mais aussi source de confusion...
    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]

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/03/2007, 12h17
  2. Réponses: 3
    Dernier message: 14/12/2006, 11h46
  3. [Système] fonction system et exécutable
    Par Luffy Duck dans le forum Langage
    Réponses: 5
    Dernier message: 03/01/2006, 17h49
  4. [Thread]Lancer mon programme toutes les 60 secondes?
    Par danje dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 24/11/2005, 21h55
  5. Réponses: 2
    Dernier message: 25/05/2004, 15h33

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