Ayuda programando para un novato

Imagen de Dabades
0 puntos

Buenas!! Estoy intentando programar una shell C para una movida que tengo que hacer pero soy incapaz de que funcione el esqueleto que me dan, porque cuando lo compilo me sale el sigiente mensaje:
root@DiegoEq:~/Universidad/SOII# gcc nsh1.c -o PRU
nsh1.c: En la función ‘main’:
nsh1.c:43: aviso: declaración implícita incompatible de la función interna ‘strcpy’
nsh1.c:46: aviso: declaración implícita incompatible de la función interna ‘strlen’
nsh1.c:51: aviso: declaración implícita incompatible de la función interna ‘exit’
/tmp/cc82eIsD.o: En funciñon `main':nsh1.c:(.text+0xa2): aviso: the `gets' function is dangerous and should not be used.

Aun así me genera el ejecutable PRU pero al intentar ejecutarlo:
root@DiegoEq:~/Universidad/SOII# PRU
bash: PRU: orden no encontrada

He instalado todas las librerias del mundo pero no hay manera, si me pudierais echar una mano de veras os lo agradecería por que no tengo ni idea de por que es.

El codigo es:

# include
# include
# include

# define TRUE 1
# define FALSE 0

/* En esta variable almaceno la linea tecleada por el usuario */
char linea[256];

/* En esta variable almaceno el numero de caracteres tecleados
por el usuario */
int num_car;

/* Devuelve la longitud del substring (caracteres distintos de blanco)
en el string que se pasa como segundo parametro. El primer

parametro debe señalar el primer caracter distinto de blanco
del substring a evaluar */

int longitud_parametro( int inicio, char *vector )
{ int longitud;

for( longitud = 0;
(vector[ inicio + longitud ] != ' ') &&
((inicio + longitud) < num_car );
longitud++ );

return( longitud );
}

main()
{ char prompt[10];

int x, i, punt_linea, longitud, argc; /* argc = contadr de argumentos */
char **argv; /* argv = vector de argumentos */
char *param;
int pid, estado;

/* Programa principal */

strcpy( prompt, "# " );

do
{ write( 1, prompt, strlen( prompt ));

/* Me tomo la licencia de utilizar gets() para leer una linea */

if( gets( linea ) == NULL )
exit(0);

num_car = strlen( linea );

/* Salto blancos y utilizo la variable punt_linea como cursor
en la linea */

for( punt_linea = 0;
(punt_linea < num_car) && (linea[punt_linea] == ' '); punt_linea++);

/* Entro en el bucle de configuracion del vector de parametros */
argc = 0;
while( punt_linea < num_car )
{
/* Averiguar longitud del parametro */
longitud = longitud_parametro( punt_linea, linea );

/* Reservar memoria para el parametro + 1 ('\0') */
param = (char *)malloc( longitud + 1);

/* Copiar parametro */
for( i = 0; i < longitud; i++ )
param[ i ] = linea[ punt_linea + i ];

param[longitud] = '\0';

/* Añadir parametro a grupo de parametros */
if (argc == 0 )
/* Inicialmente pido 2 posiciones en el vector de parametros, una
para el nuevo parametro y otra para el puntero a nulo. La
variable argc tiene almacenado el numero actual de parametros */

argv = (char **)malloc( 2 * sizeof(char *));
else
argv = (char **)realloc( argv, (argc + 2) * sizeof(char *));

argv[ argc ] = param;
argv[ ++argc ] = '\0';

/* Incremento la posicion del puntero en la linea de comandos */
punt_linea += longitud;

/* Salto blancos */
for( i = punt_linea; (i < num_car) && (linea[i] == ' '); i++ );
punt_linea = i;

} /*while( punt_linea < num_car ) */

/* Si hay argumentos crear un proceso hijo para que ejecute el comando */
if( argc > 0 )
{ pid = fork();
if( pid == 0 )
{ param = (char *)malloc( strlen( argv[0] ) + 1 );
strcpy( param, argv[0] );
execv( param, argv );
exit(0);
}
else
{ /* Soy nsh */
/* Liberar en el proceso sh la memoria asignada a la
lista de parametros */

for( x = 0; x < argc; x++)
free( argv[x]);

free( argv );

/* Espero por la terminacion del proceso creado */

waitpid( pid, &estado, 0 );

}
}
}
while( TRUE );
}

Imagen de Cristobal López
+1
0
-1

Bueno no puedo ver todo el código porque no se ve, parece ser que lo tienes medianamente bien, es decir, que lo que te aparece cuando lo compilas son warnigns (avisos) y por lo tanto te crea el ejecutable. Para ejecutarlo tienes que escribir en consola:
./PRU

y no hace falta que lo hagas como root. Seguramente luego al ejecutarlo no haga exactamente lo que tú quieres, pero se me hace difícil ayudarte porque no puedo ver todo el código del programa.
Hasta luego

+1
0
-1