Journal besoin d'aide toute conne pour programmer en C

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
28
oct.
2003
Argh ! ça me met en rogne !

--- nioubie met un ban sur *!*@*.be
--- Vous avez été kické de #linuxfr par nioubie (change de pays)
--- Ne peut rejoindre #linuxfr (Vous êtes banni).

Vraiment n'importe quoi...

Du coup me voilà obligé de polluer ici :

Je suis callé sur une connerie en C ! (mais vraiment une connerie).

J'ai un programme C. J'aimerais qu'un second programme C se forke et se transforme dans le premier avec un execve.

Je fais ça comment ? (contrainte, je peux pas modifier le premier programme)
Et comment je passe les paramètres à premier.c ?
(je fouille tous mes manuels et je trouve rien à ce sujet ! ça doit être tellement con que personne ne le note, et j'ai oublié... snif..)
  • # Re: besoin d'aide toute conne pour programmer en C

    Posté par  . Évalué à 2.

    http://www.rt.com/man/execve.2.html(...)

    prog2 :

    int main(int argc, char **argv)
    {
    if (fork())
    {
    char **env = 0;
    int result = execve("monpremier programme", argv + 1, env);
    handle_error(result);
    }
    }


    Si tu veux pas te faire chier avec env, utilise plutot execv

    RTFM comme on dit !
    • [^] # Re: besoin d'aide toute conne pour programmer en C

      Posté par  (site web personnel, Mastodon) . Évalué à 0.

      merci ! Je savais que c'était tout con !

      Mon erreur : j'appelais le premier programme comme une foncition !

      Mes livres CC By-SA : https://ploum.net/livres.html

    • [^] # Re: besoin d'aide toute conne pour programmer en C

      Posté par  (site web personnel, Mastodon) . Évalué à 0.

      ben en fait ça marche pas du tout..

      Je pige pas.. il exécute pas le "premier". J'ai pourtant essayé avec ou sans guillemets, avec ou sans un ./ avant, je pige pas...

      Mes livres CC By-SA : https://ploum.net/livres.html

      • [^] # Re: besoin d'aide toute conne pour programmer en C

        Posté par  (site web personnel, Mastodon) . Évalué à 0.

        execv ou execve me renvoie systématiquement -1 .. ARGGGH ! plizzze...

        Mes livres CC By-SA : https://ploum.net/livres.html

        • [^] # Re: besoin d'aide toute conne pour programmer en C

          Posté par  (site web personnel, Mastodon) . Évalué à 0.

          Visiblement, mon répertoire local n'est pas dans le path ! Comment ajouter ça facilement ?

          Mes livres CC By-SA : https://ploum.net/livres.html

          • [^] # Re: besoin d'aide toute conne pour programmer en C

            Posté par  . Évalué à 2.

            La plupart du temps, il faut filer l'URL absolue pour que ca marche.
            Il doit y avoir une fonction C qui te recupere le path absolu a partir d'un path relatif. Cherche un peu.
          • [^] # Re: besoin d'aide toute conne pour programmer en C

            Posté par  . Évalué à 2.

            à mon avis il se fout du path: execve(const char *filename, ...) filename doit etre le chemin absolu vers ton 2eme prog ("/usr/local/bin/prog2" quoi).

            Un conseil aussi: apres ton execve, fais un perror("ca a foiré") t'auras le message d'erreur un peu plus explicite :)
          • [^] # Re: besoin d'aide toute conne pour programmer en C

            Posté par  . Évalué à 1.

            export PATH=$PATH:.

            peut-être ?

            Mais le plus propre serait d'ajouter "./" au début du nom de ton fichier.
            • [^] # Re: besoin d'aide toute conne pour programmer en C

              Posté par  (site web personnel, Mastodon) . Évalué à 0.

              ben c visiblement pas ça !

              que ce soit avec le path absolu ou le path relatif, ou même sur une machine ou le répertoire courant est dans le path, e bien CA MARCHE PAS !


              En fait, voilà le problème :

              il me met comme erreur "Bad adress" et non "no such file or directory" !

              Mes livres CC By-SA : https://ploum.net/livres.html

              • [^] # Re: besoin d'aide toute conne pour programmer en C

                Posté par  . Évalué à 2.

                Si ça peux aider, j'ai fait exactement la même chose que plus haut, en incluant les bons fichiers de bibliothèque, en mettant une indentation humainement acceptable ;), et en mettant "./monprog" dans execve ça marche très bien.
              • [^] # Re: besoin d'aide toute conne pour programmer en C

                Posté par  . Évalué à 1.

                "Bad adress" = EFAULT = Une segfault à l'appel de ta fonction = un pointeur fou.

                Lis la man page de execve, il parle de l'argument "fichier", mais à mon avis c'est le pointeur env qui est initialisé à zéro qui ne lui plaît pas. Suis mon exemple ci-dessous ou celui de Christophe GRAND, et dis-nous si ça marche.
                • [^] # Re: besoin d'aide toute conne pour programmer en C

                  Posté par  (site web personnel, Mastodon) . Évalué à 2.

                  oki, ça marche avec la technique de Obsidian.

                  Maintenant, il reste des problèmes car il considère le premier paramètre passé comme nul (alors qu'il devrait pas l'être)

                  En fait, le programme "premier" fait un simple open(argv[1])

                  J'ai l'impression que ça rentre en conflit avec l'autre argv !

                  Merci,

                  Quand j'ai finis ça, j'offre une tournée générale de + ! :)

                  Mes livres CC By-SA : https://ploum.net/livres.html

                  • [^] # Re: besoin d'aide toute conne pour programmer en C

                    Posté par  . Évalué à 1.

                    Cela vient probablement du argv+1 qui doit être transmis tel quel au nouveau programme. le "+1" ici permet de shifter tous les arguments vers la gauche et d'éjecter le nom du fichier originel.

                    Essaie d'utiliser juste "argv" ou alors de lancer le programme tel quel mais en passant un argument dans ta ligne de commande (qui correspondrait par exemple au nom que tu voudrais donner à l'autre programme :-) ).
                    • [^] # Re: besoin d'aide toute conne pour programmer en C

                      Posté par  (site web personnel, Mastodon) . Évalué à 1.

                      en fait, comme j'ai plusieurs arguments sur mon second programme, chacun doit être passé à un enfant :

                      execv("filtre", argv+(i+1));

                      ou i est incrémenté dans une boucle while

                      Ce qui est bizarre, c'est qu'en lançant :

                      "premier_prog arg1 arg 2"

                      c'est sensé lancé un : "second_prog arg1" et un "second_prog arg2".
                      Or, il fait en fait un "secnd_prog null" et un second_prog arg2"

                      Tous les arguments après le premier marchent donc normalement !

                      Mes livres CC By-SA : https://ploum.net/livres.html

                      • [^] # Re: besoin d'aide toute conne pour programmer en C

                        Posté par  . Évalué à 7.

                        Si tu fais un argv+(i+1), tu ne transmets pas un argument à la fois mais la fin du tableau, avec chaque fois un élément en moins. Essaie plutôt:


                        /* Programme qui lance plein d'applications */

                        #include <unistd.h>
                        #include <stdio.h>
                        #include <errno.h>

                        int main (int argc,char **argv)
                        {
                        if (argc>1)
                        {
                        int i;
                        int r;
                        char * param [3];

                        param [0] = argv[0];
                        param [2] = NULL;

                        for (i=1;i<argc;i++)
                        {
                        r=fork();

                        if (!r)
                        {
                        param [1] = argv [i];
                        if (execve("./programme",param,environ)<0) perror ("Erreur sur execve");
                        }
                        else if (r<0) perror ("erreur sur fork()");
                        }
                        }
                        else fprintf (stderr,"Merci de spécifier des arguments");

                        return 0;
                        }


    • [^] # Re: besoin d'aide toute conne pour programmer en C

      Posté par  . Évalué à 3.

      char **env = 0;
      int result = execve("monpremier programme", argv + 1, env);



      #include <unistd.h>
      int result = execve("monpremier programme", argv + 1, environ);

      Comme ça, tu transmets les variables d'environnement.
      (void man environ).
  • # Re: besoin d'aide toute conne pour programmer en C

    Posté par  . Évalué à 5.

    --- nioubie met un ban sur *!*@*.be

    pas tres malin ca de bannir tous les belges :-\
  • # Re: besoin d'aide toute conne pour programmer en C

    Posté par  . Évalué à 5.

    --- Vous avez été kické de #linuxfr par nioubie (change de pays)

    y'a un équivalent au RTFM mais qui veut dire « lis la constitution, il est interdit de s'en prendre à quelqu'un sur la base de ses origines » ?

    les cons, s'il suffisait de les ignorer...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.