Shell (p,cmid);
/* interprete di comandi del sistema */
{
se in modalita' IOPX
Stampa l'intestazione;
altrimenti se in modalita' PROMPTPX
Stampa il prompt;
altrimenti se in modalita' INTPX {
se c'e' un comando
copia il puntatore al buffer;
altrimenti se c'e' un comando parziale
stampa l'eco;
ParseDetect /* riconosce la riga di comando */
}
}
void ParseDetect()
/* spezza e riconosce una riga di comando */
{
se la riga di comando termina con il carattere `&'
setta il flag Background
spezza la riga di comando in parole
memorizza la prima parola come comando
per tutte le parole dopo la prima {
se la parola comincia con il carattere `-'
aggiungila ai flag
altrimenti
memorizza la parola come parametro
}
confronta il comando con tutti i comandi interni
se coincide con un comando
CallData /* Avvia un processo nella coda d'attesa */
altrimenti
se access(comando,x) /* verifica permesso d'esecuzione */
CallData /* Avvia un processo nella coda d'attesa */
altrimenti
stampa che il comando e' sconosciuto
}
| Comando | Descrizione |
| asm | assemblatore |
| chmod | modifica le proprietà di un file |
| cls | cancella lo schermo |
| copy | fa la copia di un file |
| compact | cancella i file nel cestino |
| create | crea un file di caratteri casuali |
| del | cancella o mette nel cestino un file |
| dir | visualizza i file presenti nella directory |
| download | salva il contenuto del disco virtuale su HD |
| dump | visualizza e modifica una locazione di memoria |
| edit | edita un testo |
| format | formatta il disco |
| help | fornisce la lista dei comandi |
| kill | termina l'esecuzione di un processo |
| logout | termina la sessione |
| loop | esegue un ciclo infinito |
| passwd | modifica la password |
| ps | mostra lo stato dei processi in corso |
| seeheap | visualizza lo stato della memoria Heap |
| stat | mostra una statistica degli errori di sistema |
| testheap | permette di testare la memoria Heap |
| tiny | avvia il compilatore tiny |
| type | visualizza il contenuto di un file |
| upload | carica il contenuto del disco virtuale |
| users | mostra il nome degli utenti accreditati |
| version | mostra la versione del sistema |
chmod Modifica i permessi d'accesso ad un file. I permessi possono essere cambiati o dal proprietario del file o dal superuser. Il superuser può cambiare i permessi di tutti i file tranne che quelli del file password.
La sintassi del comando da shell prevede che si pongano prima la lista dei permessi da aggiungere e da togliere e poi il nome del file su cui operare. I permessi vengono specificati dalle lettere `r' (lettura), `w' (scrittura) e `x' (esecuzione) e possono essere preceduti dal segno `-' se li si vuole togliere, comunque valgono sia per il proprietario che per tutti gli altri utenti. I permessi, in alternativa, possono essere specificati in modo più dettagliato mediante un numero ottale a due cifre, secondo le solite regole di Unix. Per maggiore chiarezza si consideri il seguente esempio:
Se da shell il proprietario del file ``filename'' digita:
chmod 61 filename
il sistema risponderà nel modo seguente:
filename rw---x
se a questo punto il proprietario digita:
chmod +r -x filename
questa volta il sistema risponde con:
rw-r-- filename
void chmod(pun,cmid)
/* comando builtin */
/* Cambia i permessi d'accesso a un file. */
{
se i parametri non sono corretti
mostra un piccolo aiuto ed esci
riordina i parametri
se il file non esiste o e' nel cestino esci
se l'utente non e' il proprietario o il superuser esci
aggiungi i permessi da mettere
togli i permessi da levare
visualizza i permessi risultanti
}
cls Questo comando si limita a cancellare lo schermo della porta da cui viene lanciato, gli unici caratteri che restano sono quelli del prompt.
COPY (cmid,pun)
/* comando builtin */
/* copia un file */
{
se la sintassi e' errata
stampa aiuto;
altrimenti se spazio su disco insufficiente
stampa evento;
altrimenti se il file sorgente non esiste o e' nel cestino
stampa evento;
altrimenti se il file destinazione esiste o e' nel cestino
stampa evento;
altrimenti se accesso non consentito al file sorgente
stampa evento;
altrimenti {
chiama down (DISK);
copia i blocchi di dati;
aggiorna l'indice;
aggiorna i dati del disco;
chiama up (DISK);
}
}
CREATE (cmid,pun)
/* comando builtin */
/* crea un file contenente caratteri casuali */
{
Se la sintassi e' errata
stampa l'aiuto;
altrimenti verifica se il file esiste gia'
altrimenti verifica se lo spazio su disco e' sufficiente
altrimenti {
stampa l'intestazione;
chiama down (DISK);
per i da 0 fino alla dim. del file con passo 1 {
scrivi lettere casuali sul disco;
}
aggiorna l'indice della directory
chiama up (DISK);
}
}
DELETE (cmid,pun)
/* comando builtin */
/* cancella un file */
{
se la sintassi e' errata
stampa aiuto;
altrimenti se il file non esiste
stampa l'evento;
altrimenti (!access(file,w)) /* file non scrivibile */
stampa l'evento;
altrimenti {
chiama down (DISK);
aggiorna il flag di cancellatura del file;
chiama up (DISK);
}
}
DIR (cmid,pun)
/* comando builtin */
/* visualizza il contenuto della directory */
{
se la sintassi e' errata
stampa l'aiuto;
altrimenti {
stampa l'intestazione;
se il file non e' specificato {
stampa i file nel disco o nel cestino;
stampa eventuali informazioni aggiuntive;
stampa informazioni sul disco;
}
altrimenti se il file non esiste
stampa l'evento;
altrimenti
stampa le informazioni aggiuntive sul file;
}
}
}
FORMAT (cmid,pun)
/* comando builtin */
/* formatta il disco virtuale */
{
se si e' in modalita' di inizializzazione
assegna automaticamente il nome del disco;
se l'utente != superuser
stampa l'evento;
altrimenti se sintassi errata
stampa l'aiuto;
altrimenti {
chiama down(DISK);
scrivi il blocco zero;
chiama up(DISK);
se in modalita' di inizializzazione
stampa dati sul disco;
}
}
LOGIN (cmid,pun)
/* comando builtin */
/* inizializza la sessione di lavoro di un utente */
{
se si e' in modalita' di inizializzazione
entra in modalita' login;
altrimenti {
cancella schermo;
attendi che UPLD diventi up;
se il file password non e' sul disco
stampa l'evento;
altrimenti {
chiama down (DISK);
cerca il nome utente nel file;
se esiste {
verifica la password
se e' esatta {
stampa accesso consentito;
assegna il codice utente;
entra in modalita' comando;
}
altrimenti
stampa password errata;
}
altrimenti
stampa utente inesistente;
chiama up (DISK);
}
}
}
PASSWD (cmid,pun)
/* comando builtin */
/* gestione delle password */
{
se esiste il file password {
se l'utente e' il superuser {
se si e' in modalita' di inizializzazione
inizializza il file;
altrimenti se si e' in modalita' di eliminazione
elimina l'utente dal file;
altrimenti se si e' in modalita' di inserimento
inserisci nuovo utente con password;
altrimenti se si e' in modalita' di modifica
modifica la password;
}
altrimenti se la sintassi e' corretta
modifica la password dell'utente attuale;
altrimenti
stampa aiuto;
}
altrimenti stampa file non esistente;
}
void PS()
/* comando builtin */
/* mostra la lista dei thread in esecuzione */
{
per tutte le priorita' {
p punta alla testa della coda
finche' p != NULL {
stampa le caratteristiche del TCB puntato da p
p punta al prossimo TCB della coda
}
}
}
PrintERROR (p,cmid)
/* algoritmo di basso livello e comando builtin */
/* visualizza una stringa per ogni errore riconosciuto */
{
se si e' in modalita' di inizializzazione
stampa la lista degli errori con le relative statistiche
altrimenti {
verifica il tipo di errore;
stampa il codice dell'errore;
stampa la descrizione dell'errore;
}
}
TYPE (cmid,pun)
/* comando builtin */
/* stampa il contenuto di un file
{
Se la sintassi e' errata
stampa l'aiuto;
altrimenti verifica se il file non esiste
altrimenti verifica se il file e' nel cestino
altrimenti verifica se l'accesso non e' consentito in lettura
altrimenti {
se si vuole l'intestazione
stampa l'intestazione;
apri il file
finche' il file non e' finito {
leggi un blocco del file;
stampa il contenuto blocco
}
chiudi il file
}
}
UPLOAD (cmid,pun)
/* comando builtin */
/* carica il disco virtuale */
{
se in modalita' di inizializzazione
prepara le variabili di comunicazione;
se la sintassi e' errata
stampa aiuto;
altrimenti {
se non viene specificato nomefile
nomefile diventa "theos";
chiama down (DISK);
chiama down (UPLD);
upload diventa 1;
attendi che upload sia 0;
chiama up (UPLD);
chiama up (DISK);
}
}
USERS (cmid,pun)
/* comando builtin */
/* visualizza gli utenti accreditati */
{
se la sintassi e' errata
stampa aiuto;
altrimenti se il file password non esiste
stampa l'evento;
altrimenti {
stampa intestazione;
scansiona il file stampando il nome ed il codice;
}
}
Back to Lucio's Home page.