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; }
void deb_init_tab() { //On récupère l'adresse du dernier tableau inséré dans la table des symboles int addr_tab=recherche_tableau_dans_mem(); //On initialise un tableau qui va contenter le nombre d'accolades pour chaque dimension //du tableau initialiser_tab_AO_deb(); //On incrémente de 1 le compteur d'accolades lors de l'initialisation incrementer_nbAO(); //On initialise un tableau avec le nombre final d'accolades que devra contenir le tableau //tab_AO_deb en fin d'initialisation. initialiser_tab_AO_fin(addr_tab); reinitialiser_nb_elements_Tot(); //On est dans une phase où l'on va saisir des nombres, on va sauvegarder dans un tableau //printf("ADDR : %d\n", addr); //La récupération de l'adresse du tableau nous permet de calculer le nombre d'éléments du //tableau, on va récupérer le nombre d'éléments sur une ligne du tableau. int nb_nombres = recuperer_nb_element_par_ligne(addr_tab); taille_tableau(nb_nombres); //Indice auquel se trouve le nombre d'élements dans une ligne du tableau maj_indiceDIm(addr_tab); }