PDA

View Full Version : [C] Creare Shell


Emaborsa
09-04-2010, 16:11
Ciao,
Facoltà d'Informatica, secondo semestre, materia Sistemi Operativi.
Il primo semestre abbiamo imparato Java e me la cavo benone. Ora però dal nulla, pretendono che scriviamo una semplice shell in C. Io ho letto in giro, a lezione si parla di semafors, pipes, system calls....ma ciò non mi aiuta a scrivere una shell. In pratica deve "solo" implementare comandi semplici, basilari, ma non ho la più pallida idea di come cominciare.
Qualcuno mi sa dare delle dritte?

lupoxxx87
09-04-2010, 19:19
devi fare un programma che a seconda delle richieste faccia determinate operazioni. non credo che richiedano anche la grafica e tutto...

devi reimplementare i classici comandi cp, ls, mv ...

Emaborsa
11-04-2010, 19:15
devi fare un programma che a seconda delle richieste faccia determinate operazioni. non credo che richiedano anche la grafica e tutto...

devi reimplementare i classici comandi cp, ls, mv ...

Si lo so, ma il punto è che non so dove cominciare con C. Con Java ad occhi quasi chiusi ti scrivo ti scrivo un programma...

cionci
12-04-2010, 14:05
Si lo so, ma il punto è che non so dove cominciare con C. Con Java ad occhi quasi chiusi ti scrivo ti scrivo un programma...
Non avete mai fatto C e nemmeno C++ ?

fero86
12-04-2010, 14:38
Si lo so, ma il punto è che non so dove cominciare con C. in C si comincia "ammainando", ovvero scrivendo la funzione "main" :D

la funzione main ha diversi possibili prototipi, questo é il piu semplice:
int main();

questo é un programma C scheletrico:
#include <stdlib.h>
#include <stdio.h>

int main() {
return 0;
}


i due #include all'inizio servono ad importare due headers predefiniti, ossia due files contenenti le dichiarazioni di funzioni predefinite del linguaggio che si usano molto spesso nei programmi C e che é praticamente certo che userai nello scrivere una shell.

clockover
12-04-2010, 17:27
Se vi ha chiesto una shell penso abbiate già fatto le varie exec

da uno sguardo qui dovrebbe aiutarti http://linux.die.net/man/3/execvp

Emaborsa
22-05-2010, 11:17
Se vi ha chiesto una shell penso abbiate già fatto le varie exec

da uno sguardo qui dovrebbe aiutarti http://linux.die.net/man/3/execvp

Abbiamo parlato si di exec, forc e roba simile....ma comunque non so come cominciare. Mi sa che appena finito gli esami mi comprerò un "C for dummies". :D

clockover
22-05-2010, 13:06
Abbiamo parlato si di exec, forc e roba simile....ma comunque non so come cominciare. Mi sa che appena finito gli esami mi comprerò un "C for dummies". :D

Se hai cominciato con quella roba li hai tutto quello che ti basta per creare una semplice shell... basta solo la buona volontà.. e tanta pazienza ;)

DanieleC88
23-05-2010, 11:04
Non avete mai fatto C e nemmeno C++ ?

E visto che devono usare delle system call mi sembra decisamente strano. :stordita:

Emaborsa
23-05-2010, 13:52
E visto che devono usare delle system call mi sembra decisamente strano. :stordita:

Se hai cominciato con quella roba li hai tutto quello che ti basta per creare una semplice shell... basta solo la buona volontà.. e tanta pazienza ;)


Il punto è che non mi sembra una cosa da fare. C'è gente come me che all'inizio dell'anno non aveva la più pallida idea della programmazione. Il primo semestre abbiamo fatto JAVA, e ora ci chiedono la shell in C senza darci un minimo di introduzione di C....

pabloski
23-05-2010, 14:11
Il punto è che non mi sembra una cosa da fare. C'è gente come me che all'inizio dell'anno non aveva la più pallida idea della programmazione. Il primo semestre abbiamo fatto JAVA, e ora ci chiedono la shell in C senza darci un minimo di introduzione di C....

senza C non penso andrete lontano

per la shell, beh, è banale visto che si tratta di un programma che legge in input dei comandi e tramite fork e exec li esegue

clockover
23-05-2010, 15:33
Il punto è che non mi sembra una cosa da fare. C'è gente come me che all'inizio dell'anno non aveva la più pallida idea della programmazione. Il primo semestre abbiamo fatto JAVA, e ora ci chiedono la shell in C senza darci un minimo di introduzione di C....

Scusa ma sono scettico sul fatto che non siate stati nemmeno introdotti al C!

Emaborsa
23-05-2010, 15:36
Scusa ma sono scettico sul fatto che non siate stati nemmeno introdotti al C!

http://www.unibz.it/en/inf/progs/bacs/courses/pages/default.aspx?AspxAutoDetectCookieSupport=1

Questo è il link dei corsi della facoltà. Se guardi nel primo semestre vedrai Introduction To Programming, dove vedrai che come linguaggio è stato trattato solo Java. Nel secondo semestre trovi Operating System dove viene richiesta la Shell.

clockover
23-05-2010, 15:46
Abbiamo parlato si di exec, forc e roba simile....ma comunque non so come cominciare. Mi sa che appena finito gli esami mi comprerò un "C for dummies". :D

Non mi pare che qui tu abbia detto la stessa cosa.. Se avete parlato di exec, fork, ecc... qualcosa hai visto.... e il manuale C compralo prima degli esami..

comunque da uno sguardo qui http://www.lilik.it/~mirko/gapil/gapil.html

Emaborsa
23-05-2010, 15:49
Non mi pare che qui tu abbia detto la stessa cosa.. Se avete parlato di exec, fork, ecc... qualcosa hai visto.... e il manuale C compralo prima degli esami..

comunque da uno sguardo qui http://www.lilik.it/~mirko/gapil/gapil.html

Si, ci ha spiegato del forc, exec, dei signals, dei pipes. Ma un conto è parlarne, un conto e programmare in C.
Comunque sia devo farlo, salterò l'esame a giungo e mi dedicherò al C d'estate.

clockover
23-05-2010, 15:55
Guarda che per imparare a programmare non c'è mica bisogno del tipo che ti fa vedere come si scrive un "hello world"... come già ti ho detto serve solo buona volontà.... e mi pare che non ne hai molta.... ciao

morgoth90
25-05-2010, 20:33
per fare una shell di base bastano proprio qualche fork e pipe, se ti interessa quì (http://tylyos.osdev.it/wiki/index.php/Pipe) c'è qualche appunto che ho scritto a rigurado

cionci
25-05-2010, 20:35
morgoth90: sei pregato di modificare l'immagine in firma e riportarla a termini di regolamento. Grazie :)

Emaborsa
25-05-2010, 21:12
per fare una shell di base bastano proprio qualche fork e pipe, se ti interessa quì (http://tylyos.osdev.it/wiki/index.php/Pipe) c'è qualche appunto che ho scritto a rigurado

Ci darò un occhiata. Quello che la shell deve fare:


1. your program should be able to read commands from standard input and execute them in a loop until a built-in command exit is issued
2. be able to redirect the standard input and output of commands. This has to be done by prefixing to the command you input (<your command> ) in and out. Specifically you have to type in <new input> <your command> and out <new out> <your command> for redirecting stdin and stdout respectively.
3. be able to terminate the running process (in foreground) when user presses ^C and return back to the mini-shell;
4. be able to interrupt process temporarily, when user presses ^Z, returning to the mini-shell; Up to here all minimal requirements requested to access the exam. The following ones allows higher ranking.
5. be able to execute any number of processes in background (i.e., in parallel with the foreground process), including in particular, the ability to start another process while a process has been temporarily suspended;
6. inform the user when the background process finishes or is waiting for an input from the terminal;
7. be able to inform the user what commands are executing in the background by issuing the built-in command jobs, this should include information about the state of the process (i.e., suspended, background, waiting for input, etc.) and about what file(s) is the background process using for standard input and output);
8. be able to terminate involuntarily a background processes by issuing the built-in command kill job-number.
9. to be able to resume a process or to make a background process into the foreground process (i.e., the one that currently interacts with the terminal) by issuing the fg job-number command.

ErodeGrigo
26-05-2010, 08:42
Guarda che per imparare a programmare non c'è mica bisogno del tipo che ti fa vedere come si scrive un "hello world"... come già ti ho detto serve solo buona volontà.... e mi pare che non ne hai molta.... ciao

Approfitto.... :D

Perchè nel classico "Hello Word" se uso la printf senza includere la libreria stdio.h il programma funziona lo stesso?

Non dovrebbe darmi errore?

Bye.

morgoth90
26-05-2010, 10:51
Approfitto.... :D

Perchè nel classico "Hello Word" se uso la printf senza includere la libreria stdio.h il programma funziona lo stesso?

Non dovrebbe darmi errore?

Bye.

perchè nella fase di link il linker trova la funzione nel file oggetto delle librerie standard (che di default vengono linkate a meno che sia esplicitamente specificato il contrario)

DanieleC88
26-05-2010, 11:19
Perché nessuno abilita i warning. :mad:

ErodeGrigo
26-05-2010, 11:51
perchè nella fase di link il linker trova la funzione nel file oggetto delle librerie standard (che di default vengono linkate a meno che sia esplicitamente specificato il contrario)

Grazie....

Immaginavo che fosse per questo.

Quindi sono automaticamente linkate: stdio, stdlib.

Anche altre o solo queste?

Bye.

cionci
26-05-2010, 11:55
Vengono linkate le librerie precompilate all'eseguibile (solitamente incluse nel runtime del compilatore). Non vengono inclusi i .h ;)

ErodeGrigo
26-05-2010, 13:06
Vengono linkate le librerie precompilate all'eseguibile (solitamente incluse nel runtime del compilatore). Non vengono inclusi i .h ;)

Uhm....quali sono queste librerie? dipende dal compilatore? io uso devc++ ma non riesco a trovare questa informazione tra le varie opzioni

In pratica come faccio a sapere se una inclusione come time.h o stdio.h è superflua o necessaria?

Bye.

cionci
26-05-2010, 13:49
Tu includile tutte e non ti sbaglierai mai...