Forum Programmation.c free apres un Exec

Posté par  .
Étiquettes : aucune
0
7
déc.
2009

Bonjour !!


J'execute ce code dans un programme

execvp(arg[0],arg);


Avez vous une idée sur la facon de liberer la memoire allouée pour char ** arg et pour les chaque char* le composant ?

Merci d'avance !
  • # Pourquoi ?

    Posté par  . Évalué à 1.

    Après un appel à execvp ou consorts, le contexte d'exécution de ton programme est remplacé par celui du processus que tu lances.
    D'ailleurs c'est écrit en toutes lettres dans man 2 execve :

    execve() does not return on success, and the text, data, bss, and stack of the calling process are overwritten by that of the program loaded.


    Donc je ne vois pas trop ce que tu veux faire après un exec. Peux-tu donner des détails ?
    • [^] # Re: Pourquoi ?

      Posté par  . Évalué à 1.

      Effectivement, c'est ce qui cette propriété d'exec qui me pose probleme.

      Je m'explique...

      Dans mon programme, j'alloue de la memoire dynamiquement pour arg...

      char ** arg

      arg = (char**) calloc(...)

      et pour les chaines de caracteres composant arg

      arg[i]= malloc(...)

      Je voudrais liberer cette mémoire à l'aide d'un free apres l'exec mais je je vois pas du tout comment le faire puisque le programme est remplacé apres l'appel d'exec.

      Tu vois ce que je veut dire ?
      • [^] # Re: Pourquoi ?

        Posté par  . Évalué à 3.

        Je vois bien mais ca n'est pas un problème : Le contexte du programme appelant est détruit au moment de l'exec.
        Ca veut dire que toutes les allocations dynamiques sont récupérées par l'OS, les descripteurs de fichiers sont fermés... Comme à la sortie d'un programme.
        Bon, dans ce cas particulier, la liste d'argument n'est pas supprimée mais transférée dans le contexte du programme que tu lances.
        Pour toi ca ne changes rien, pas besoin de faire de free.
      • [^] # Re: Pourquoi ?

        Posté par  . Évalué à 2.

        Les arguments passés dans arg sont copiés par le système sur la pile du programme lancé par execve. Ensuite, toute la mémoire allouée est écrasée lors de l'execve par les données du nouveau programme. Il n'y a donc rien à libérer.
      • [^] # Re: Pourquoi ?

        Posté par  . Évalué à 1.

        Si tes arguments ne sont pas kilométriques, je ferais un VLA (Variable Length Array), soit un tableau de longueur x dans un bloc, de façon à ce que tes informations soient dans la pile plutôt que dans le tas, pour te laisser le temps de faire un free() avant de lancer ton execve().

Suivre le flux des commentaires

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