Cómo escribir shell en lenguaje c
#include?lt;stdio.hgt;
#include?lt;signal.hgt;
#include?lt;unistd.hgt;
#include?lt;string.hgt;
#include?lt;stdlib.hgt;
# include?lt;fcntl.hgt;
#include?lt;sys/wait.h gt;
#define?MAX(100)
#define ?LEN(100)
char?*arglist[MAX];?//lista de parámetros del comando shell
int?num;?//número de parámetros del comando shell
int?execute(char*?arglist[])//Ejecutar comando externo
{
int?error;
error=execvp(arglist [ 0], arglist);
if ?(error==-1)?printf("falló\n");
salir(1);
}
char*?make(char?*buf)//pasar cadena a la lista de argumentos
{
char?*cp;
cp= malloc(strlen(buf) 1);
si?(cp==NULL)
{
fprintf(stderr, " no ?memoria\n");
salir(1);
}
strcpy(cp, buf);
regresar ? cp;
}
int?my_system(char?*buf, char?*arglist[])//Dividir por cadena
{
int?num,j,i,last;
char? buffer[LEN];
num=0;
i=0;
¿mientras?(numlt;MAX)
{
si?(buf[i]=='\n')
{
arglist[num]=NULL
return?num
}
si?(buf[i]== ' ?') ? i ;
last=i;
mientras?(buf[i]! ='? ? amp;amp;?buf[i]! = '\ n ')?i;
for?(j=last;jlt;i;j)?buffer[j-last]=buf[j];
buffer[j- último ]='\0';
arglist[num ]=make(buffer);
}
}
int? internal (char?*arglist[])//ejecutar instrucción incorporada
{
if?(strcmp(arglist[0], "exit\0
")==0)//salir
{
salir(0 );
¿regresar?;
}
else
if?(strcmp(arglist[0], "pwd\0")==0)//pwd
{
char?buf[LEN];
getcwd(buf, sizeof(buf)); //obtener el directorio actual
printf("Current?dir?is: s\n", buf);
regresar?;
}
si no
si?(strcmp(arglist[0], "cd\ 0 ")==0)//cd
{
char?buf[LEN];
if?(chdir(arglist[1])gt; =0)
{
getcwd(buf, sizeof(buf));
printf("¿Actual?dir?is:s\n",buf );
}
¿volver?;
}
¿otra cosa?
}
void?cat_in(char?*q)//redireccionamiento de entrada
{
char?t[30];
int? fd;
si?(q[0]=='lt;')
{
strcpy(t, q 1);
fd=open(t, O_RDONLY);
arglist[1]= NULL;
if?(fd==-1)
{
printf("archivo?abierto?fallido\n");
return;
}
dup(fd, 0) ;
close(fd);
}
}
void?cat_out(char?*q)//redirección de salida
{
char?t[30];
int?fd;
if?(q[0]=='gt ;')
{
strcpy(t,q 1);
arglist[num-1]=NULL;
num --;
fd=open(t, O_CREAT|O_RDWR);
si?(fd==-1)
{
printf("archivo?abierto ?fallido\n");
return;
}
dup2(fd, 1);
cerrar(fd);
}
}
}
int?i, pid;
char?buf[LEN];
while(1)
{
fgets(buf, LEN, stdin); //Leer instrucciones de una sola línea
num=my_system(buf, arglist); //División de instrucciones
int?inner_flag;
inner_flag=inner(arglist); instrucciones
Emitir juicio
if?(inner_flag==0)
{
pid=fork(); //Crear un nuevo proceso
si?(pid==0)
{
si?(arglist[1]! =NULL)
{
char?q[LEN];
strcpy(q, arglist[1]);
cat_in(q); //Redirección de entrada
}
si?(arglist[num-1]! =NULL)
{
char?q[LEN];
strcpy(q, arglist[num-1]);
cat_out(q); // redirección de salida
}
execute(arglist);/ /ejecutar
}
waitpid(pid, NULL, 0
}
}
}
¿volver?;
}
.