Hvordan lage et enkelt skall i C?

Hvordan lage et enkelt skall i C?
Skallet er som et program som mottar kommandoinnganger fra brukerens tastatur og sender dem til en maskin som skal utføres av kjernen. Det sjekker også for å se om brukerens kommandoinnganger er riktige. Det kan være et kommandolinjegrensesnitt, som det vi skal opprette, eller et grafisk brukergrensesnitt, som vanlig programvare som Microsoft Office eller Adobe Suite.

Denne opplæringen vil guide deg gjennom stadiene med å lage et uavhengig enkelt skall i C. Etter å ha fullført denne opplæringen, bør du ha en bedre forståelse av de forskjellige prosessene og funksjonene som er involvert, samt en klar gjennomførbar måte å kode selv.

Hva er den grunnleggende levetiden til skallet?

I løpet av levetiden utfører et skall tre store oppgaver.

  • Initialiser: I dette stadiet vil et typisk skall lese i tillegg til å utføre sitt sett med konfigurasjonsfiler. Disse endrer skallets oppførsel.
  • Tolke: Skallet leser deretter kommandoer fra “stdin” og utfører dem.
  • Terminere: Etter utførelsen av kommandoene utfører skallet noen av nedleggelseskommandoene, frigjør ethvert minne og avsluttes.

Disse stadiene er generelle, og de kan være anvendelige for et bredt spekter av programmer, men vi vil bruke dem som grunnlag for vårt skall. Skallet vårt vil være så grunnleggende at det ikke vil være noen konfigurasjonsfiler og ingen avslutningskommando. Så vi vil ganske enkelt utføre loopingfunksjonen og deretter avslutte. Imidlertid er det viktig å huske at programmets levetid er mer enn bare sløyfe.

Hvordan lage et enkelt skall i C?

Vi vil lage et grunnleggende skall i C som vil demonstrere grunnleggende om hvordan det fungerer. Fordi målet er demonstrasjon i stedet for å ha fullstendighet eller til og med egnethet til tilfeldig bruk, har det en rekke begrensninger, inkludert

  • Alle kommandoer må skrives på en linje.
  • Whitespace må brukes til å skille argumenter.
  • Det vil ikke være noe sitering eller slipper ut Whitespace.
  • Det er ingen rør eller omdirigering.
  • De eneste innebygde er 'CD', 'Help' og 'Exit'.

Ta nå en titt på et C -program som bygger et enkelt skall.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int Komal_cd (char ** args);
int Komal_Help (char ** args);
int Komal_Exit (char ** args);
char *bygget_in_string [] =

"CD",
"hjelp",
"exit"
;
int (*build_in_function []) (char **) =

& Komal_cd,
& Komal_Help,
& Komal_Exit
;
int Komal_Builtins ()

returstørrelse av (bygget_in_string) / sizeof (char *);

int Komal_cd (char ** args)

if (args [1] == null)

fprintf (stderr, "Komal: forventet argument til" cd "\ n");

ellers

if (chdir (args [1]) != 0)

Perror ("Komal");


retur 1;

int Komal_Help (Char ** Args)

int jeg;
printf ("Dette er enkel C -skallbygg av Komal Batool \ n");
printf ("Type programnavn og argumenter, og treff Enter.\ n ");
printf ("Følgende er innebygd: \ n");
for (i = 0; i < komal_builtins(); i++)

printf (" %s \ n", build_in_string [i]);

printf ("Bruk Man -kommandoen for informasjon om andre programmer.\ n ");
retur 1;

int Komal_Exit (Char ** Args)

retur 0;

int Komal_launch (char ** args)

pid_t pid;
int -status;
PID = gaffel ();
if (pid == 0)

if (execvp (args [0], args) == -1)

Perror ("Komal");

exit (exit_failure);
annet hvis (pid < 0)

Perror ("Komal");

ellers

gjøre

Waitpid (PID, & Status, wuntraced);
samtidig som (!Kone (status) && !Wifsignaled (status));

retur 1;

int Komal_execute (char ** args)

int jeg;
if (args [0] == null)

retur 1;

for (i = 0; i < komal_builtins(); i++)
if (strcmp (args [0], build_in_string [i]) == 0)
return (*build_in_function [i]) (args);


Returner Komal_Launch (args);

char *Komal_read_line (ugyldig)

#ifdef Komal_use_std_getline
char *line = null;
ssize_t bufsize = 0;
if (getline (& line, & bufsize, stdin) == -1)

if (feof (stdin))

exit (exit_success);

ellers

Perror ("Komal: getline \ n");
exit (exit_failure);


returlinje;
#ellers
#Define Komal_RL_BUFSIZE 1024
int bufsize = Komal_rl_bufsize;
int posisjon = 0;
char * buffer = malloc (sizeof (char) * bufsize);
int c;
hvis (!buffer)
fprintf (Stderr, "Komal: Allocation Error \ n");
exit (exit_failure);

mens (1)

c = getChar ();
if (c == eof)

exit (exit_success);

ellers hvis (c == '\ n')

buffer [posisjon] = '\ 0';
Returbuffer;
annet
buffer [posisjon] = c;

posisjon ++;
if (posisjon> = bufsize)

bufsize += Komal_rl_bufSize;
buffer = realloc (buffer, bufsize);
hvis (!buffer)

fprintf (Stderr, "Komal: Allocation Error \ n");
exit (exit_failure);



#slutt om

#Define Komal_TOK_BUFSIZE 64
#define Komal_tok_delim "\ t \ r \ n \ a"
char ** Komal_split_line (char *line)

int bufsize = Komal_tok_bufSize, posisjon = 0;
char ** tokens = malloc (bufsize *sizeof (char *));
char *token, ** tokens_backup;
hvis (!symboler)

fprintf (Stderr, "Komal: Allocation Error \ n");
exit (exit_failure);

token = strtok (linje, Komal_tok_delim);
mens (token != Null)

symboler [posisjon] = token;
posisjon ++;
if (posisjon> = bufsize)

bufsize += Komal_tok_bufSize;
tokens_backup = tokens;
symboler = realloc (tokens, bufsize * sizeof (char *));
hvis (!symboler)

gratis (tokens_backup);
fprintf (Stderr, "Komal: Allocation Error \ n");
exit (exit_failure);


token = strtok (null, Komal_tok_delim);

symboler [posisjon] = null;
Return -tokens;

void Komal_loop (ugyldig)

char *linje;
char ** args;
int -status;
gjøre

printf (">");
line = Komal_read_line ();
args = Komal_split_line (linje);
Status = Komal_Execute (args);
gratis (linje);
gratis (args);
mens (status);

int main (int argc, char ** argv)

Komal_loop ();
return exit_success;

Kodebeskrivelse

Ovennevnte kode er en enkel implementering av et kommandolinjeskall skrevet i C. Skallet heter “Komal”, Og den kan utføre innebygde kommandoer som "CD", "Hjelp" og "Exit", samt eksterne kommandoer. Hovedfunksjonen til programmet er “Komal_loop” funksjon, som løkker kontinuerlig, leser inndata fra brukeren via “Komal_read_line” funksjon, dele inn inngangen i individuelle argumenter ved å bruke “Komal_split_line” funksjon, og utføre kommandoen ved hjelp av “Komal_execute” funksjon.

De “Komal_execute” Funksjonssjekker om kommandoen er en innebygd kommando, og i så fall utfører den den tilsvarende innebygde funksjonen. Hvis kommandoen ikke er en innebygd kommando, utfører den en ekstern kommando ved å forkle en barneprosess og ringe “Execvp” Systemanrop for å erstatte barneprosessens minneplass med ønsket program.

De “Komal_cd”, “Komal_Help”, og “Komal_exit” Funksjoner er de tre innebygde funksjonene som kan utføres av brukeren. “Komal_cd” Endrer gjeldende arbeidskatalog, “Komal_help” gir informasjon om skallet og dets innebygde kommandoer, og “Komal_exit” Avslutter skallet.

Produksjon

Konklusjon

Å bygge et enkelt skall i C innebærer å forstå hvordan du kan analysere og utføre kommandoer, håndtere brukerinngang og utgang og administrere prosesser ved hjelp av systemanrop som gaffel og execvp. Prosessen med å lage et skall krever en dyp forståelse av programmeringsspråk og UNIX -operativsystem. Imidlertid, ved hjelp av trinnene og eksemplet gitt i ovennevnte guide, kan man lage et grunnleggende skall som kan håndtere brukerinngang og utføre kommandoer.