La shell normale vi presenta il prompt '$' che vedete dopo il login (a
meno che non lo abbiate personalizzato). Non parleremo della sintassi
della shell e delle cose semplici che potete vedere da soli sullo
schermo; daremo piuttosto uno sguardo dietro le quinte a quello che
succede dal punto di vista del computer.
Dopo la fase di avvio, e prima che sia eseguito un programma, potete
pensare al vostro computer come a un contenitore di un repertorio di
processi che stanno tutti aspettando qualcosa da fare. Stanno tutti
aspettando degli eventi. Un evento può essere voi che premete
un tasto o muovete il mouse. Oppure, se il vostro computer è collegato
a una rete, un evento può essere un pacchetto di dati che arriva
lungo quella rete.
Il kernel è uno di questi processi. È uno speciale, perché controlla
quando gli altri processi utente possono girare ed è
normalmente l'unico processo con accesso diretto all'hardware del
computer. Infatti, i processi utente devono fare richiesta al kernel
quando vogliono ottenere un input dalla tastiera, scrivere sullo
schermo, leggere o scrivere su disco o fare qualsiasi altra cosa che
non sia macinare bit in memoria. Queste richieste sono note come
chiamate di sistema.
Normalmente tutto l'I/O passa attraverso il kernel, così quest'ultimo
può organizzare le operazioni e impedire che i processi si ostacolino
a vicenda. Alcuni processi utente speciali hanno il permesso di
aggirare il kernel, di solito per ottenere accesso diretto alle porte
I/O. I server X (i programmi che gestiscono le richieste degli altri
programmi di generare grafica sullo schermo, sulla maggior parte dei
computer Unix) sono gli esempi più comuni al riguardo. Ma non siamo
ancora arrivati a un server X; state guardando il prompt della shell
su una console a caratteri.
La shell è solo un processo utente, e neppure uno tanto
speciale. Attende che voi digitiate qualcosa, ascoltando (attraverso
il kernel) sulle porte I/O della tastiera. Come il kernel vede che
avete digitato qualcosa lo visualizza sullo schermo e poi lo passa
alla shell. Quando il kernel vede un `Invio' passa la vostra linea di
testo alla shell. La shell tenta di interpretare questo testo come se
si trattasse di comandi.
Diciamo che digitate `ls' e Invio per invocare il programma Unix che
elenca le directory. La shell applica le sue regole incorporate per
indovinare che volete lanciare il comando eseguibile nel file
`/bin/ls'. Fa una chiamata di sistema chiedendo al kernel di far
partire /bin/ls come un nuovo processo figlio e di dargli
accesso allo schermo e alla tastiera attraverso il kernel. Poi la
shell va a dormire, aspettando che ls finisca.
Quando /bin/ls ha finito dice al kernel che ha terminato emettendo una
chiamata di sistema exit. Il kernel allora sveglia la shell e
le dice che può riprendere a girare. La shell emette un altro prompt e
attende un'altra linea di input.
Tuttavia (supponiamo che stiate elencando una directory molto lunga)
potrebbero succedere altre cose mentre `ls' è in esecuzione. Potreste
passare su un'altra console virtuale, fare il log in di là e iniziare
una partita a Quake, per esempio. Oppure immaginate di essere
collegati a Internet. Il vostro computer potrebbe spedire o ricevere
posta mentre /bin/ls è in esecuzione.