Piccolo emulatore shell in C

di il
2 risposte

Piccolo emulatore shell in C

Salve devo fare un programma in c che simuli una shell linux. Il problema del mio programma è che i comandi senza argomenti (esempio: ls) li accetta mentre comandi tipo "echo 3" mi da errore nella execvp e non capisco il perchè.
L'idea del mio programma è di prendere da tastiera una stringa suddividerla con strtok in parole inserirle in un array di stringhe e concatenare alla prima parola /bin/ così che una volta passata alla execvp la riconosca.

Questo è il mio codice:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

void esegui(char **c){
	int status;
	int pid=fork();
	if(pid==0){
		execvp(c[0],c);
		perror("execl");
		exit(EXIT_FAILURE);
	}else if(pid!=-1){
		if(waitpid(pid,&status,0) == -1){
			perror("waitpid: ");
			exit(EXIT_FAILURE);
		}else{
			return;
		}
	}else{
		perror("fork");
		return;
	}
}

char **inizializza(char *in){
	char **ret;
	ret=malloc(1*sizeof(char*));
	ret[0]=malloc(30*sizeof(char));
	strcpy(ret[0],"/bin/");
	char *p;
	int i=0;
	p=strtok(in," ");
	while(p){
		i++;
		printf("%s \n",p);
		if(i!=1){
			ret=realloc(ret,i);
			int len=strlen(p);
			len++;
			ret[i-1]=malloc(len*sizeof(char));
			strcpy(ret[i-1],p);
		}else{
			strcat(ret[0],p);
		}
		p=strtok(NULL," ");
	}
	return ret;
}
	
int main(){
	char in[1024];
	printf("cmd prompt>> ");
	scanf("%s",in);
	while(strcmp(in,"exit")!=0){
		char **pass=inizializza(in);
		esegui(pass);
		printf("cmd prompt>> ");
		scanf("%s",in);
	}
	return 0;
}
Attendo qualche soluzione grazie.

2 Risposte

  • Re: Piccolo emulatore shell in C

    Prova a cambiare l'acquisizione dei dati, scanf non è adatta in questo caso
    Una idea è
    
       
    int main(){
    
    	char in[1024];
    	printf("cmd prompt>> ");
    	
    	do  {
    		char c;
    		int i=0;
    		do {
    			c=getchar();
    			in[i]=c;
    			i++;
    		} while (c != '\n');
    		in[i-1]='\0';
    		char **pass=inizializza(in);
    		esegui(pass);
    		printf("cmd prompt>> ");
       } while ((strcmp(in,"exit")!=0));
       
       return 0;
    
    }
    
  • Re: Piccolo emulatore shell in C

    Grande ora funziona menomale non è la parte della fork che è l'argomanto nuovo ahahah grazie
Devi accedere o registrarti per scrivere nel forum
2 risposte