Je suis tombé sur un truc intéressant intitulé "Communication classique entre processus"
concernant une "possibilité rarement proposée par les shell".
Il s'agit tout simplement de l'emploi du pipe, ce afin de rediriger l'entrée ET la sortie ( c'est là la nouveauté ) d'une sous routine de mon programme père. Ce système permet l'exécution de sous-routines à la chaîne, et donc de créer un programme composé uniquement de sous-routines - que j'appellerais modules du programme. En concaténant plusieurs modules, on peut arriver à créer un nouveau programme basé sur ces mêmes modules.
Mon programme n'est qu'un utilisateur de sous programmes/routines/modules.
Il est destiné à l'édition ( via un utilitaire d'édition en ncurses ) de nouveaux programmes dont les paramètres ( aide, modules au format json avec messages d'erreur pour chacun d'entre eux etc... ) seront classés au sein d'une base de donnée.
Chaque sous routine devra dès lors être imbriquée dans une liste doublement chaînée afin de faciliter la correction des erreurs, l'éditeur permettant à tout instant de lancer un programme partiel ( ou pas ) afin d'en vérifier les résultats intermédiaires.
J'ai même envie de donner à mon module le nom "concat", la fonctionnalité qui m'a amené à rédiger ce topic.
Alors je sais que c'est un peu imbuvable question longueur,
```J'essaierai de faire mieux la prochaine fois, en me rappelant du conseil donné plus haut par j_m et en gardant un formatage décent.
Préférez strncat et strncpy qui vous éviterons des ennuis, d'autant que vous recalculez la longueur juste avant.
J'ai fait comme vous me l'avez préconisé.
Vous aviez raison pour le calloc... En effet, result peut avoir été alloué au préalable.
voici le code spécifique à concat dans internal:
int len = 0;
for(int l = 1; l < p->args[i][1] - 1; l++)
len += strlen(p->commands[i][l]);
if(*size < len){
*size = len;
if(!*size)
*result = calloc(len + 1, sizeof(char));
else
*result = realloc(*result, (len + 1) * sizeof(char));
}
strncpy(*result, p->commands[i][1], strlen(p->commands[i][1]));
for(int l = 2; l < p->args[i][1] - 1; l++)
{
strncat(*result, p->commands[i][l], strlen(p->commands[i][l]));
}
return 256;
En ce qui concerne size, j'avais oublié de lui affecter len. size est un marqueur qui me permet de savoir si result mérite d'être ré-alloué dans fd_readn. Dans ce cas, il est incrémenté en conséquence dans cette dernière fonction avant la prochaine itération de la boucle de process_exec.
[^] # Re: Reallocation sans free ?
Posté par gunsailor . En réponse au message ma j'galère sur un simple free sur un string. Évalué à 2.
Merci David pour toutes ces suggestions.
```
Il s'agit tout simplement de l'emploi du pipe, ce afin de rediriger l'entrée ET la sortie ( c'est là la nouveauté ) d'une sous routine de mon programme père. Ce système permet l'exécution de sous-routines à la chaîne, et donc de créer un programme composé uniquement de sous-routines - que j'appellerais modules du programme. En concaténant plusieurs modules, on peut arriver à créer un nouveau programme basé sur ces mêmes modules.
Mon programme n'est qu'un utilisateur de sous programmes/routines/modules.
Il est destiné à l'édition ( via un utilitaire d'édition en ncurses ) de nouveaux programmes dont les paramètres ( aide, modules au format json avec messages d'erreur pour chacun d'entre eux etc... ) seront classés au sein d'une base de donnée.
Chaque sous routine devra dès lors être imbriquée dans une liste doublement chaînée afin de faciliter la correction des erreurs, l'éditeur permettant à tout instant de lancer un programme partiel ( ou pas ) afin d'en vérifier les résultats intermédiaires.
J'ai même envie de donner à mon module le nom "concat", la fonctionnalité qui m'a amené à rédiger ce topic.
```J'essaierai de faire mieux la prochaine fois, en me rappelant du conseil donné plus haut par j_m et en gardant un formatage décent.
J'ai fait comme vous me l'avez préconisé.
Vous aviez raison pour le calloc... En effet, result peut avoir été alloué au préalable.
voici le code spécifique à concat dans internal:
En ce qui concerne size, j'avais oublié de lui affecter len. size est un marqueur qui me permet de savoir si result mérite d'être ré-alloué dans fd_readn. Dans ce cas, il est incrémenté en conséquence dans cette dernière fonction avant la prochaine itération de la boucle de process_exec.
Merci de votre attention.
Le problème n'est toujours pas résolu.