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 ?
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.
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.
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.
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().
# Pourquoi ?
Posté par Benoît Monin . Évalué à 1.
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 lylo01 . Évalué à 1.
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 Benoît Monin . Évalué à 3.
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 netsurfeur . Évalué à 2.
[^] # Re: Pourquoi ?
Posté par Obsidian . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.