Jak utworzyć prostą skorupę w C?

Jak utworzyć prostą skorupę w C?
Shell jest jak program, który odbiera wejścia poleceń z klawiatury użytkownika i wysyła je do komputera do wykonania przez jądro. Sprawdza również, czy wejścia poleceń użytkownika są prawidłowe. Może to być interfejs wiersza poleceń, taki jak ten, który utworzymy, lub graficzny interfejs użytkownika, taki jak normalne oprogramowanie, takie jak Microsoft Office lub Adobe Suite.

Ten samouczek poprowadzi Cię przez etapy tworzenia niezależnej prostej powłoki w C. Po zakończeniu tego samouczka powinieneś lepiej zrozumieć różne zaangażowane procesy i funkcje, a także wyraźny, wykonalny sposób na samodzielne kodowanie.

Jaki jest podstawowy okres życia skorupy?

Podczas jego życia skorupa wykonuje trzy główne zadania.

  • Zainicjuj: Na tym etapie czytana jest typowa powłoka, a także wykonywać swój zestaw plików konfiguracyjnych. Zmieniają to zachowanie skorupy.
  • Interpretować: Shell następnie odczytuje polecenia z „stdin” i wykonuje je.
  • Zakończyć: Po wykonaniu jego poleceń powłoka wykonuje które.

Te etapy są ogólne i mogą mieć zastosowanie do szerokiej gamy programów, ale wykorzystamy je jako podstawę naszej powłoki. Nasza powłoka będzie tak podstawowa, że ​​nie będzie plików konfiguracyjnych i żadnych polecenia wyłączania. Tak więc po prostu wykonamy funkcję zapętlania, a następnie wyjdziemy. Należy jednak pamiętać, że życie programu jest czymś więcej niż tylko zapętlaniem.

Jak utworzyć prostą skorupę w C?

Stworzymy podstawową powłokę w C, która pokaże podstawy, w jaki sposób funkcjonuje. Ponieważ jego celem jest demonstracja, a nie kompletność funkcji, a nawet sprawność w przypadkowym użyciu, ma wiele ograniczeń, w tym

  • Wszystkie polecenia muszą być wpisane w jednym wierszu.
  • Whitespace należy wykorzystać do oddzielania argumentów.
  • Nie będzie cytowania ani ucieczki.
  • Nie ma rurociągów ani regeneracji.
  • Jedyne wbudowane są „cd”, „help” i „wyjście”.

Teraz spójrz na program C, który buduje prostą skorupę.

#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
int Komal_CD (char ** args);
int Komal_Help (char ** args);
int Komal_Exit (char ** args);
char *budowany_in_string [] =

"płyta CD",
"pomoc",
"Wyjście"
;
int (*budowa_in_function []) (char **) =

i Komal_CD,
i Komal_Help,
i Komal_Exit
;
int Komal_Builtins ()

return sizeof (budowany_in_string) / sizeof (char *);

int Komal_CD (char ** args)

if (args [1] == null)

fprintf (stderr, „Komal: oczekiwany argument do„ cd ”\ n”);

w przeciwnym razie

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

Perror („Komal”);


zwrot 1;

int Komal_Help (char ** args)

int i;
printf („To jest prosta kombinacja C Build by Komal Batool \ n”);
printf („Wpisz nazwy i argumenty programów i naciśnij Enter.\N");
printf („Poniższe są wbudowane: \ n”);
dla (i = 0; i < komal_builtins(); i++)

printf („ %s \ n”, budowany_in_string [i]);

printf („Użyj polecenia MAN, aby uzyskać informacje na temat innych programów.\N");
zwrot 1;

int Komal_Exit (char ** args)

powrót 0;

int Komal_Launch (char ** args)

pid_t pid;
status int;
PID = rozwidlenie ();
if (PID == 0)

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

Perror („Komal”);

exit (exit_failure);
else if (pid < 0)

Perror („Komal”);

w przeciwnym razie

Do

WaitPid (PID i status, wuntraced);
chwila (!Żona (status) && !Wifsignaled (status));

zwrot 1;

int Komal_Execute (char ** args)

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

zwrot 1;

dla (i = 0; i < komal_builtins(); i++)
if (strcmp (args [0], zbudowany_in_string [i]) == 0)
return (*budowany_in_function [i]) (args);


return Komal_Launch (args);

char *Komal_Read_line (void)

#ifdef Komal_use_std_getline
Char *linia = null;
ssize_t bufSize = 0;
if (getline (& line i bufSize, stdin) == -1)

if (feof (stdin))

exit (exit_success);

w przeciwnym razie

Perror („Komal: getline \ n”);
exit (exit_failure);


linia powrotna;
#w przeciwnym razie
#definicja Komal_RL_BUFSIZE 1024
int bufSize = Komal_rl_BufSize;
int pozycja = 0;
char * bufor = Malloc (sizeof (char) * bufSize);
int c;
Jeśli (!bufor)
fprintf (stderr, „Komal: Błąd alokacji \ n”);
exit (exit_failure);

While (1)

c = getchar ();
if (c == eof)

exit (exit_success);

w przeciwnym razie if (c == '\ n')

bufor [pozycja] = '\ 0';
Bufor powrotu;
w przeciwnym razie
bufor [pozycja] = c;

pozycja ++;
if (pozycja> = bufSize)

bufSize += Komal_rl_BufSize;
bufor = realLoc (bufor, bufSize);
Jeśli (!bufor)

fprintf (stderr, „Komal: Błąd alokacji \ n”);
exit (exit_failure);



#endif

#Define Komal_Tok_BufSize 64
#Define Komal_Tok_DeLim "\ t \ r \ n \ a"
Char ** Komal_Split_line (Char *Line)

int bufSize = Komal_Tok_BufSize, pozycja = 0;
char ** tokens = malloc (bufSize *sizeof (char *));
char *token, ** tokens_backup;
Jeśli (!tokeny)

fprintf (stderr, „Komal: Błąd alokacji \ n”);
exit (exit_failure);

token = strtok (linia, Komal_Tok_DeLim);
podczas gdy (token != Null)

tokeny [pozycja] = token;
pozycja ++;
if (pozycja> = bufSize)

BUFSIZE += KOMAL_TOK_BUFSIZE;
tokens_backup = tokeny;
tokens = realLoc (tokeny, bufSize * sizeof (char *));
Jeśli (!tokeny)

za darmo (tokens_backup);
fprintf (stderr, „Komal: Błąd alokacji \ n”);
exit (exit_failure);


token = strtok (null, Komal_Tok_DeLim);

tokeny [pozycja] = null;
Powrót tokeny;

void Komal_Loop (void)

linia char *;
char ** args;
status int;
Do

printf (">");
line = Komal_Read_Line ();
args = Komal_Split_line (linia);
status = Komal_Execute (args);
wolna linia);
darmowe (args);
while (status);

int main (int argc, char ** argv)

Komal_Loop ();
return exit_success;

Opis kodu

Powyższy kod to prosta implementacja powłoki wiersza polecenia napisanego w C. Pokłona nosi nazwę „Komal”, i może wykonywać wbudowane polecenia, takie jak „CD”, „pomoc” i „wyjście”, a także polecenia zewnętrzne. Główną funkcją programu jest „Komal_Loop” funkcja, która zapętla się w sposób ciągły, czytanie danych wejściowych od użytkownika za pośrednictwem „Komal_read_line” funkcja, podzielanie danych wejściowych na poszczególne argumenty za pomocą „Komal_split_line” funkcja i wykonywanie polecenia za pomocą „Komal_execute” funkcjonować.

„Komal_execute” Funkcja sprawdza, czy polecenie jest wbudowanym poleceniem, a jeśli tak, wykonuje odpowiednią wbudowaną funkcję. Jeśli polecenie nie jest poleceniem wbudowanym, wykonuje polecenie zewnętrzne, rozwijając proces dziecka i wywołując „EXECVP” Wezwanie systemowe w celu zastąpienia przestrzeni pamięci procesu dziecka żądanym programem.

„Komal_cd”, „Komal_help”, I „Komal_exit” Funkcje to trzy wbudowane funkcje, które mogą być wykonywane przez użytkownika. „Komal_cd” zmienia obecny katalog roboczy, „Komal_help” dostarcza informacji o powłoce i wbudowanych poleceń oraz „Komal_exit” Wyjawia skorupę.

Wyjście

Wniosek

Budowanie prostej powłoki w C obejmuje zrozumienie, jak analizować i wykonywać polecenia, obsłużyć wprowadzanie i wyjście użytkownika oraz zarządzać procesami za pomocą wywołań systemowych takich jak widelca i execvp. Proces tworzenia skorupy wymaga głębokiego zrozumienia języka programowania C i systemu operacyjnego UNIX. Jednak za pomocą kroków i przykładu podanego w powyższym przewodniku można utworzyć podstawową powłokę, która może obsługiwać wprowadzanie użytkownika i wykonać polecenia.