void shell_aux() { char * input=(char *)malloc(TAILLE_INPUT*sizeof(char));//Allocation de la chaine de caractère pour gérer la saisi au clavier int pid_child=0,taille=0; Liste l=listenouv();//Allocation de la liste l_handler=l; input_handler=input;//Mise en place des valeurs des variables globales pour la fin du programme (pour leur désallocation) int hide=0;//Variable qui vaut 1 si on lance le programme avec '&', 0 sinon int i=0;//indice du caractère '&' int status; char ** arg=NULL;//Pointeur pour un tableau de chaine de caractère Commande c; while(1) { do { printf("> : "); //Si on envoie un EOF ou on tape "exit" dans le terminal, cela provoque l'appel de la fonction qui arrête le programme if((fgets(input,TAILLE_INPUT,stdin) == NULL) || estExit(input)) handler(0);//Provoque la désallocation des autres ressources puis la fin du programme wait_hidden_child(l);//On regarde si un/des processus de la liste de ps caché est mort, et si c'est le cas, on affiche sa notification de décès } while(input[0]=='\n');//Demande de saisi tant que l'utilisateur appuie sur Entrée sans indiqué de commande taille=taille_tableau(input); input[taille-1]='\0';//On remplace le '\n' en fin de chaine de caractères par un '\0' i=recherche(input,'&');//On recherche le caractère "&" pour indiqué si oui ou non on doit cacher l'execution du processus if(i==-1) hide=0; else { hide=1; input[i]=' ';//Transforme le '&' par un espace input=elimine_espace_fin(input,taille); c.commande=malloc((taille+1)*sizeof(char)); strcpy(c.commande,input);//Copie l'intitulé de la commande (tapé au clavier) } arg=separation_argument(input);//Sépare les arguments de la commande pour les envoyer à exec plus tard pid_child=fork(); if(!pid_child) { execvp(arg[0],arg);//Lance l'exec de la commande saisi au clavier de la part du fils créer par un fork pour ça } else { c.pid=pid_child; if(!hide) waitpid(pid_child,&status,0);//Si on ne doit pas cacher l'execution du processus fils, on fait un waitpid simple sur le pid de ce processus else { adjq(l,c);//Sinon on ajoute la structure commande à la liste des processus cachés printf("[%d] %d\n",l->taille,pid_child);//Affiche une notification de lancement de processus caché (avec l'ordre d'insertion dans la liste, ainsi que le pid du processus) } } freeArg(arg);//Libère le tableau d'argument } return; }
/*! Frees from memory the given function and its content @param fun the function to free from memory @return 0 */ bool freeFun (tap_fun* fun) { freeExpr(fun->body); int numargs; if (fun->maxargs == ARGLEN_INF) { numargs = fun->minargs; } else { numargs = fun->maxargs; } int i; for (i = 0; i < numargs; ++i) { freeArg(fun->args[i]); } free(fun); return 0; }
void offline(int id){ if(peers[id]) freeArg(peers[id]); peers[id] = NULL; }