PDA

Visualizza la versione completa : [ C ] Mi dire dove sta l'errore ?!?


Ed_Bunker
04-05-2004, 17:57
Ditemi dove sta l'errore... :master: :master: :master:

/*
File: microshell-0.c
Specifica: piccola shell che esegue un comando passato (con argomenti) dallo STDIN, ne restituisce codice di uscita e torna ad attendere un successivo comando
Data: 28-04-2004
Problema: Non considera gli argomenti passati. Inoltre bisogna "per forza" dare uno spazio dopo aver digitato il comando sullo standard input
*/

#include <sys/types.h>
#include "sysmacro.h"
#include "util.h"
#define TRUE 1
#define MAXCOMMANDLENGTH 100

int main (int argc, char * argv[])
{
int pid;
char * stringa = (char*) malloc(sizeof(char) * MAXCOMMANDLENGTH);/*Al massimo un comando di 100 caratteri*/
char**a;
int n;
int contaComando = 0;
int statoComando = 0;
while(TRUE)
{
contaComando++;
printf("PROMPT>");
fgets(stringa, MAXCOMMANDLENGTH, stdin);
a = split_arg(stringa, " ", &n);
if ((pid = fork()) == -1)
{
perror("Padre> errore nella fork");
exit(0);
}
if (pid == 0)
{/*FIGLIO*/
execvp(a[0], &a[1]);//<-- L'errore e' qua ?!?
perror("Figlio> errore nella exec");
/*Perror solo in caso d'errore*/
}
else
{/*PADRE*/
wait(&statoComando);
printf("Padre> eseguito comando n.: %d ; stato di uscita : %d\n", contaComando,statoComando);
}

}
return(0);/*Mai...*/
}



Questo e', invece, il codice dove si trova la funzione split_args(...);

/*
File: util.c
Specifica: funzioni di utilita'
*/

/* include per stat */
#include <sys/stat.h>

/* include per malloc e strlen */
#include <stdlib.h>
#include <string.h>

#include "util.h"
.....
.....
.....

@description -- split_arg ritorna il vettore dei token in una stringa separati da un qualsiasi carattere separatore

@param -- linea, la linea da cui estrarre i token
@param -- separatori, i caratteri separatori
(es ": ;", due punti, blank e puntevvirgola)
@param -- numerotoken (OUTPUT) contiene il numero dei token trovati

@return -- puntatore all'array di token (stesso formato di argv) */

char ** split_arg(char *linea, char *separatori, int *numerotoken)
{
int i = 0; /* numero token trovati */
char **argv; /* vettore dei token */
char *copialinea; /* copia della linea */
char **indirizzocopialinea = &copialinea; /* punta a copialinea */

/* copia la stringa argomento */
copialinea = malloc( strlen(linea) + 1 );
strcpy(copialinea, linea);

/* alloca la prima posizione vettore dei token */
argv = malloc(sizeof(char *));

while( (argv[i] = strsep(indirizzocopialinea, separatori)) != NULL ) {

/* ancora un token */
i++;

/* ridimensiona vettore dei token */
argv = realloc(argv, (i + 1) * sizeof(char *));
}

/* scrive il numero di token trovati */
*numerotoken = i;

/* libera lo spazio allocato */
free(copialinea);
return(argv);
}

THKS

Ed_Bunker
04-05-2004, 21:04
Dai ragazzi dateci un'occiata, please !!!

rocco.g
04-05-2004, 22:40
sto imparando il C da poco...però credo che per darti una mano dovremmo sapere cosa c'è nei due files inclusi... altrimenti senza quelli non si può compilare il sorgente e capire qual è l'errore...


cmq il compilatore che cosa ti dice ?

Ed_Bunker
05-05-2004, 15:09
Originariamente inviato da rocco.g
sto imparando il C da poco...però credo che per darti una mano dovremmo sapere cosa c'è nei due files inclusi... altrimenti senza quelli non si può compilare il sorgente e capire qual è l'errore...


cmq il compilatore che cosa ti dice ?
Il file "sysmacro.h" contiene soltanto delle macro. Utilizzato moltissime volte sono certo non ci siano errori. util.h contiene solo le dichiarazioni delle funzioni definite nel file util.c che ho stampato. L'errore si trova in cio' che ho scritto. I due 'punti' che sicuramente generano errore sono o la fgets o la split_args.

rocco.g
05-05-2004, 17:45
fammi avere in qualke modo anke gli altri due files così lo compilo sul mio pc... perchè altrimenti non so come fare a correggere l'errore dato che non sono espertissimo di C e senza le infos del compilatore non saprei mettere mano...

Ed_Bunker
05-05-2004, 20:38
Originariamente inviato da rocco.g
fammi avere in qualke modo anke gli altri due files così lo compilo sul mio pc... perchè altrimenti non so come fare a correggere l'errore dato che non sono espertissimo di C e senza le infos del compilatore non saprei mettere mano...
I files eccoli qua: sysmacro.h (http://www.di.unipi.it/~susanna/LPS/sysmacro.h)
util.c (http://www.di.unipi.it/~susanna/LPS_04/util.c)
util.h (http://www.di.unipi.it/~susanna/LPS_04/util.h)

Devi importare sysmacro.h e util.h

Poi, fai cosi:

-gcc -c utilc //Crea il file oggetto util.o
-gcc -o nomefile nomefile.c util.o //Crea l'eseguibile nomefile linkando il file oggetto util.o
-nomefile//Esecuzione

rocco.g
05-05-2004, 22:02
ho provato a compirarlo...
mi ha dato tre warning:

(24) : warning C4013: 'S_ISDIR' undefined; assuming extern returning int
(101) : warning C4013: 'strsep' undefined; assuming extern returning int
(101) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int '


lo guardo più accuratamente domani e ti faccio sapere...
spero cmq che qualcun altro più esperto prenda parte alla discussione e ti possa aiutare...

Ed_Bunker
06-05-2004, 10:58
La funzione split_arg funziona correttamente. L'ho appena provata a parte e fa cio' che ci si aspetta. L'errore continuo a pensare sia nel modo in cui i parametri vengono passati alla execvp. Pero'...

rocco.g
06-05-2004, 18:20
credo anke io che l'errore stia nel come sono stati passati a parametri alla funzione in questione, però non so come risolverlo, fai una cosa perchè non cambi il titolo del topic ? così magari qualcuno che ne sa di più lo legge e ti aiuta...

Loading