Saludos. He creado este interprete de comandos para que puede ejecutar programas de /bin/ y de el directorio actual:
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
int pid,status;
int esta=0; /* Esta variable nos indica si &*/
/* se encuentra en el comando introducido*/
int posicion; /*En esta variable se almacena la posicion del &*/
int i; /*Contador*/
char programa[20];
char bin[20];
printf("\pedro: ");
gets(programa);
if(strlen(programa)!=0) /*Por si el usuario pulsa enter directamente*/
{
for(i=0;i<=(strlen(programa)-1);i++)
{
if(programa[i]=='&')
{
esta=1;
posicion=i;
}
}
/*Siempre busca el & al final de la cadena*/
if(esta)
programa[posicion]='\0';
}
while(strcmp(programa,"salir")!=0)
{
switch(pid=fork()){
case -1: /*Gestion del error*/
exit(1);
break;
case 0: /*Proceso hijo*/
strcpy(bin,"./");
strcat(bin,programa);
execl(bin,programa,0);
strcpy(bin,"/bin/");
strcat(bin,programa);
execl(bin,programa,0);
printf("\nComando o nombre de archivo incorrecto\n");
exit(1);
break;
default: /*Proceso padre*/
/*Si existe background, el proceso padre*/
/*no esperara al hijo*/
if (!esta) wait(&status);
break;
}
esta=0;
printf("\pedro: ");
gets(programa);
fflush(stdin);
if(strlen(programa)!=0) /*Por si el usuario no introduce nada*/
{
for(i=0;i<=(strlen(programa)-1);i++)
{
if(programa[i]=='&')
{
esta=1;
posicion=i;
}
}
/*Siempre busca el & al final de la cadena*/
if(esta)
programa[posicion]='\0';
}
}
printf("\nFin de la ejecucion\n");
return 0;
}/*fin de main*/
Ahora bien, el programa creo que funciona, porque ejecuta en background y en modo normal (si pudieseis probarlo me hariais un favor). Lo que no se hacer es que quiero que me reconozca tambien si pongo sleep 10& para poder ver que esta ejecutandose en background. Este codigo no incluye los parametros (no quiero que los incluya) pero solo quiero que me reconozca sleep 10. Indicadme si es posible como hacerlo, gracias.