Пример #1
0
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;
}
Пример #2
0
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);
}