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

Linux Discussion :

Débutant sur les fork() et exec()


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut Débutant sur les fork() et exec()
    Salut, alors voilà deux petites questions par rapport à mon code. Tout d'abord quand je fais if (argc == 2) et que ne met qu'un seul argument ça me met le message d'erreur (ça va au "sinon" en fait) et je ne comprend pas.
    Ensuite par rapport à execl, je ne comprend pas comment l'utiliser :s... sachant qu'en fait je veux tout simplement lancer le programme donné en argument dans le fork

    Merci d'avance pour vos réponses

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Par défaut
    Bonjour

    pourrai tu posté ton code complet ?
    Merci
    if [[ "$argc" -eq 2 ]]; then ; fi
    if ((argc==2)); then ; fi

    mais j'aimerais voir ton code tout de meme

    de plus la commande exec permet soit de rediriger les descripteurs soit d'executer une commande dans un sous shell.

    exec commande ,attention si tu l'utilise dans une boucle n'oublie pas une condition de sortie sinon tu vas te retrouvé avec un nombre de processus interminable.

    sinon pour les descripteur

    exec < fichier
    exec > fichier
    exec 2>&1 fichier
    exec 2> fichier
    exec 5<&0
    exec 5<&0- pour fermer les descripteur
    tu peut aussi ajouter des descripteur [0-9]
    cela peut parfois etre utile
    man exec y a plein d'exemple

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 834
    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 834
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sin-an Voir le message
    Salut, alors voilà deux petites questions par rapport à mon code. Tout d'abord quand je fais if (argc == 2) et que ne met qu'un seul argument ça me met le message d'erreur (ça va au "sinon" en fait) et je ne comprend pas.
    argc contient en fait le nb d'arguments plus un pour le nom du programme (argv[0]). Avec un argument => argc=2 !!!

    Citation Envoyé par Sin-an Voir le message
    Ensuite par rapport à execl, je ne comprend pas comment l'utiliser :s... sachant qu'en fait je veux tout simplement lancer le programme donné en argument dans le fork
    Ben le fork te duplique ton code dans un fils. Ainsi le fils contient une copie du code du père. Si dans le fils tu fais un execl, le code du fils (copie de celui du père) sera remplacé par le code du programme

    Code minimaliste
    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
     
    int main()
    {
        pid_t pid;
     
        switch(pid=fork())
        {
              case -1: // Erreur
                    ...
                    break;
              case 0: // Fils
                    execl("/bin/ls", "ls", "-l", NULL);
                    break;   // Inutile puisque le exec remplace le code mais on ne perd pas ses habitudes
              default: // Père
                     ... (un truc pour pas qu'il s'arrète sinon le fils passe en background)
         }
    }
    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]

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Code minimaliste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                    break;   // Inutile puisque le exec remplace le code mais on ne perd pas ses habitudes
    pas si inutile que ca...si execl foire par exemple...enfin, dans ce ca ce serai plutot un return -ENOMEM qu'il faudra ou un truc du genre...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    Merci de vos réponse, en effet j'ai oublié de copié le code ^^, le voici (c'est en C ^^, j'ai vu des réponses en sh):
    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
    28
    29
    30
    31
    32
    33
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/wait.h>
     
    int main(int argc, char * argv[])
    {
    	pid_t pid;
    	int stat;
     
    	if (argc == 2)
    	{
    		if ((pid = fork()) == -1)
    		{
    			fprintf(stderr,"Echec de fork : %d", errno);
    			exit(EXIT_FAILURE);
    		}
    		else
    		{
    			if (pid == 0)
    			{
    				execl(argv[1], NULL);
    				perror("echec d'execution...");
    			}
    			else
    				wait(&stat);
    		}
    		else
    			fprintf(stderr, "Lancez la commande avec un argument");
     
    	return EXIT_SUCCESS;
    }
    Justement j'ai argc == 2 et pourtant quand je lance avec un argument ça va au else :s
    Et pour la commande excl en fait je voulais savoir comment faire pour lancer avec ma chaine de caractere contenu dans le premier argument parce que ce que j'ai fais ne marche pas.
    Merci

  6. #6
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    c'est normal, probleme d'acolades

  7. #7
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    pas testé mais ca devrai fonctionner !
    je comprend meme pas comment ca a pu compiler...
    apprend a bien indenter ton code, et si ca peut t'aider, utilise un editeur qui te montrera ou commence et ou se termine une acolade...

    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
    int main(int argc, char * argv[])
    {
      pid_t pid;
      int stat;
      if (argc == 2){
        if ((pid = fork()) == -1){
          fprintf(stderr,"Echec de fork : %d", errno);
          exit(EXIT_FAILURE);
        }
        else{
          if (pid == 0){
            execl(argv[1], NULL);
            perror("echec d'execution...");
          }                                          
          else
            wait(&stat);
        }
      }else
        fprintf(stderr, "Lancez la commande avec un argument");
        return EXIT_SUCCESS;
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    Bon ben en fait j'avais pas de problème
    en effet je viens de remettre le argc == 2 et le else avant de poster parce que je les avaient enlevé pour pouvoir tester le exec et j'ai pas testé la compilation, et en effet pb d'accolade et là j'ai tout remi en ordre et testé et du coup tout marche, que ce soit la condition sur argc ==2 ou le execl
    j'avais du faire une c*nnerie quelque part
    Merci pour vos réponses en tout cas

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

Discussions similaires

  1. Exercice en c sur les forks+Pipe+exec
    Par Elendhil dans le forum Linux
    Réponses: 6
    Dernier message: 07/11/2007, 19h32
  2. [chart] Débutant sur les création de séries
    Par titiyo dans le forum Débuter
    Réponses: 1
    Dernier message: 25/08/2007, 09h51
  3. question de débutant sur les jointures
    Par dreamcocktail dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2006, 15h24
  4. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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