Red de conocimiento informático - Material del sitio web - Cómo escribir shell en lenguaje c

Cómo escribir shell en lenguaje c

/* Autor: Samsons Fecha: 2015.4.10*/

#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?;

}

.