2009-09-30 12 views
23

Jestem nowicjuszem do zarządzania procesami i wątkami. Mój Shell powinien zrozumieć zmienną środowiskową PATH. Można go ustawić i zmodyfikować. Działa na dwa sposoby - tryb interakcji &. Shell może wykonywać więcej niż jedno zadanie, np. Ls; ps; wc file; cal. Chcę też zabrudzić sobie ręce sygnałami. Powinienem więc także obsługiwać^K,^c.Jak mogę zaimplementować własną podstawową powłokę uniksową w C?

Wiem, że będę musiał używać execów, widelców i rur, ale po prostu nie mogę zacząć.

+2

Czy to kwestia pracy domowej? Jeśli tak, powinieneś oznaczyć go odpowiednio. – Amok

+2

Nie, nie jest tak! –

Odpowiedz

14

Wszystkie powłoki unix są open-source - więc dobrym miejscem do rozpoczęcia może być odczytanie kodu.

Jeśli szukasz dobrego artykułu na początek artykułu na ten temat, wypróbuj Writing Your Own Shell z Linux Gazette.

Innym dobrym punktem wyjścia jest przyjrzenie się kodem źródłowym mini-shell tylko dlatego, że jest jednym z najmniejszych, aby uzyskać głowę.

8

Twoim głównym pętli:

  • czytać wiersz (użyj fgets(3) prostego skorupkach, readline(3) dla fantazyjny jeden)
  • analizować Komenda
  • widelec i wykonanie rurociągów

Aby przeanalizować polecenie, można wybrać dwie wspólne opcje. Napisz parser rekurencyjny lub użyj yacc(1), aby go wygenerować. O wiele łatwiej jest wyeksponować początkowy parser za pomocą yacc, ale można całkowicie utknąć przy debugowaniu i naprawdę chce on być pozbawiony kontekstu. Wolę rekurencyjne zejście, ale prawie wszyscy na świecie wolą używać yacc. (Technicznie rzecz biorąc, bison.) Jeśli powłoka jest naprawdę bardzo prosta, jak powłoka zadania domowego, Yacc może być przesadą.

Aby przeprowadzić analizę leksykalną, można również rzucić własną lub użyć flex.

Nie musisz używać żadnych wątków.

+3

Polecam używać 'readline()' w każdym przypadku - sprawi, że twoje życie stanie się nieskończenie łatwiejsze, o ile będziesz musiał używać tej powłoki. Ale +1 za ugrzęzienie w yacc/żubrze. Dobre narzędzia, ale upraszczanie jest trudnym zadaniem. –

+0

Jeśli chcesz tylko uruchamiać programy z powłoki yoyur, to nie potrzebujesz parsera i lexera ... ale jeśli chcesz robić "inne" rzeczy, proponuję użyć flex + yacc ... * do nie toczyć własnego * – aviraldg

+1

Dostaję to. Ale chcę też zabrać ręce za brudne sygnały. Powinienem więc także obsługiwać^K,^c. –

Powiązane problemy