2009-09-30 1 views
23

Sono un principiante per l'elaborazione e la gestione dei thread. La mia shell dovrebbe comprendere la variabile di ambiente PATH. Può essere impostato e modificato. Funziona in due modi: modalità batch interattiva &. Shell è in grado di prendere più di un lavoro come ls; ps; wc file; cal. Voglio sporcarmi le mani anche con i segnali. Quindi dovrei gestire anche^K,^c.Come posso implementare la mia shell di Unix di base in C?

So che dovrò usare exec, forks e pipe ma non posso iniziare.

+2

È questo una domanda compiti a casa? Se è così, dovresti taggarlo in modo appropriato. – Amok

+2

No Non è così! –

risposta

14

Tutte le shell Unix sono open-source, quindi un buon punto di partenza potrebbe essere la lettura del codice.

Se stai cercando un buon articolo di avviamento sul soggetto prova Writing Your Own Shell dalla Linux Gazette.

Un altro buon punto di partenza è dare un'occhiata al codice sorgente di mini-shell solo perché è uno dei più piccoli a farsi strada.

8

vostro ciclo principale è:

  • leggere una linea (utilizzare fgets(3) per un semplice shell, readline(3) per una fantasia)
  • analizzare il comando
  • forcella ed eseguire le condutture

Per analizzare il comando, ci sono due scelte comuni. Scrivi un parser di discesa ricorsivo o usa yacc(1) per generarne uno. È molto più facile battere un parser iniziale usando yacc, ma è possibile rimanere completamente bloccati nel debugging e vuole davvero essere privo di contesto. Preferisco la discesa ricorsiva, ma quasi tutti gli altri al mondo preferiscono usare yacc. (Tecnicamente, bison.) Se la shell è davvero molto semplice, come una shell per i compiti, yacc potrebbe essere eccessivo.

Per eseguire l'analisi lessicale è anche possibile eseguire il rollover o utilizzare flex.

Non è necessario utilizzare alcun thread.

+3

Vorrei raccomandare che 'readline()' sia usato in ogni caso - renderà la tua vita infinitamente più facile purché tu debba usare detto shell. Ma +1 per impantanarsi in yacc/bisonte. Buoni strumenti, ma è un compito difficile da semplificare. –

+0

Se vuoi solo eseguire programmi dalla shell di yoyur, non hai bisogno di un parser e di un lexer ... tuttavia se vuoi fare "altre" cose allora ti suggerisco di usare flex + yacc ... * do non tirare il tuo * – aviraldg

+1

Mi sta prendendo. Ma voglio sporcarmi le mani anche con i segnali. Quindi dovrei gestire anche^K,^c. –