Ejemplo n.º 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;
}
Ejemplo n.º 2
0
/*! 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;
}
Ejemplo n.º 3
0
void offline(int id){
	if(peers[id]) freeArg(peers[id]);
	peers[id] = NULL;
}