|
| | progetto per la creazione di una nuova shell... | |
| | Autore | Messaggio |
|---|
darkjoker Admin


Numero di messaggi: 813 Data d'iscrizione: 30.07.07
 | Oggetto: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 4:56 pm | |
| ciao a tutti... come avrete capito dal titolo, ho un progetto un po' ambizioso... creare una shell interamente scritta in c... Beh, dopotutto, pensandoci una shell è un semplice ( piu o meno) programma che agisce sopratutto coi file, ma svolge anche altri tipi di funzioni.. col c, anche se avete letto solo la mia guida, saprete certo operare tranquillamente con i file, se vi siete spinti oltre, allora avrete delle ottime conoscenze... Bene, ora che ci avete pensato un attimo avrete capito che la shell è fattibile, dobbiamo solo unire le nostre menti... questo è il programma che avevo fatto io un po di tempo fa..: | Codice: | //Beta Version #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <time.h> #define USERNAME "darkjoker" //mettete qui il vostro nickname... int inizio (); int view (); int quit (); int calc (); int help (); int aboutme (); int hexdec (); int dirx (); int copia (); main (){ inizio (); while (1 == 1){ char scelta; printf ("%s@shell: & ", USERNAME); scanf ("%c", &scelta); switch (scelta){ case 'd': dirx (); break; case 'v': view (); break; case 'q': exit (1); break; case 'c': calc (); break; case 'h': help (); break; case 'a': aboutme (); break; case 'x': hexdec (); break; case 'p': copia (); break; default: break; } } } int inizio (){ printf ("\n\nBenvenuto %s\n\nVerra avviata una nuova sessione.\n\n\n", USERNAME); } int view (){ FILE *toread; char file[20], txt[100]; printf ("Inserire il nome del file da leggere: "); scanf ("%s", &file); toread = fopen (file, "r"); if (toread == NULL){ printf ("Impossibile leggere il file.\n"); } while (!feof(toread)){ fgets (txt, sizeof(txt), toread); printf ("%s", txt); } } int calc (){ int scelta, ad1, ad2, sm, mn, st, df, ft1, ft2, pr, dv, ds, qu; printf ("Scegli che cosa fare:\n1. Addizione\n2. Sottrazione\n3. Prodotto\n4. Divisione\n"); scanf ("%d", &scelta); switch (scelta){ case 1: printf ("Inserire il primo addendo: "); scanf ("%d", &ad1); printf ("Inserire il secondo addendo: "); scanf ("%d", &ad2); sm = ad1 + ad2; printf ("Risultato: %d\n", sm); break; case 2: printf ("Inserire il minuendo: "); scanf ("%d", &mn); printf ("Inserire il sottraendo: "); scanf ("%d", &st); df = mn - st; printf ("Risultato: %d\n", df); break; case 3: printf ("Inserire il primo fattore: "); scanf ("%d", &ft1); printf ("Inserire il secondo fattore: "); scanf ("%d", &ft2); pr = ft1 * ft2; printf ("Risultato: %d\n", pr); break; case 4: printf ("Inserire il dividendo: "); scanf ("%d", &dv); printf ("Inserire il divisore: "); scanf ("%d", &ds); if (ds == 0){ printf ("Impossibile dividere per 0\n"); break; } qu = dv / ds; printf ("Risultato: %d\n", qu); break; default: printf ("Comando non valido.\n"); break; } } int help (){ printf ("\n\nHelp\n"); printf ("\n"); printf ("v : visualizza il contenuto di un file.\n"); printf ("\n"); printf ("c : apre una calcolatrice.\n"); printf ("\n"); printf ("q : esce dalla shell\n"); printf ("\n"); printf ("a : mostra un messaggio riguardante l'autore\n"); printf ("\n"); printf ("h : visualizza questo messaggio\n"); printf ("\n"); printf ("x : apre un proramma per la conversione da decimale a esadecimale\n"); printf ("\n"); printf ("d : visualizza il contenuto di una directory\n"); printf ("\n"); printf ("p : copia un file.\n"); printf ("\n\n"); } int aboutme (){ printf ("\n\nQuesto programma e stato creato da: darkjoker\nLa parte rigurdante le directory e stata fatta quasi completamente a cura di BlackLight.\n"); } int hexdec (){ int scelta, hexdec, dechex; printf ("Cosa vuoi fare?\n1. Decimale >> Esadecimale\n2. Esadecimale >> Decimale\n"); scanf ("%d", &scelta); switch (scelta){ case 1: printf ("Inserire valore decimale da trasformare: "); scanf ("%d", dechex); printf ("%d >> %x\n", dechex, dechex); break; case 2: printf ("Inserire valore esadecimale da trasformare: "); scanf ("%x", hexdec); printf ("%x >> %d\n", hexdec, hexdec); break; default: printf ("Opzione non valida.\n"); } }
int dirx(){ DIR *dy; struct dirent*info; int num=0; int max_fname=0; int i,rnd; char **names; char direct[20]; printf ("Inserire il nome della directory da analizzare: "); scanf ("%s", &direct); dy = opendir(direct); while (info=readdir(dy)) { num++;
if (strlen(info->d_name)>max_fname) max_fname=strlen(info->d_name); } names = (char**) malloc(num*sizeof(char*));
for (i=0; i<num; i++) names[i] = (char*) malloc(max_fname*sizeof(char));
closedir(dy); dy = opendir(direct);
for (i=0; info=readdir(dy); i++) strncpy (names[i],info->d_name,max_fname);
closedir(dy); i--; while (i >= 0){ printf ("%s\n", names[i]); i--; } } int copia (){ FILE *orig; FILE *des; char origine[20], dest[20], linea[1000]; printf ("Inserire il nome del file da copiare: "); scanf ("%s", &origine); printf ("Inserire il nome della destinazione: "); scanf ("%s", &dest); if (origine == NULL){ printf ("Impossibile aprire il file di origine.\n"); } if (dest == NULL){ printf ("Impossibile aprire il file di destinazione.\n"); } orig = fopen (origine, "r"); des = fopen (dest, "w"); while (!feof (orig)){ fgets (linea, sizeof (linea), orig); fprintf (des, "%s", linea); } }
|
se lo usate, vedete che è abbastanza elementare, usando il comando h potete vedere le sue "capacita".. molto limitate... no? quello che vi chiedo è di copiarvi il codice e modificarlo a vostro piacimento, aggiungendo nuove funzioni e modificando quelle esistenti... Se poi c'è qualcuno di voi che se la cava con le stringhe, gli chiederei di trasformare i comandi da semplici lettere a intere parole... Purtroppo bisogna usare la libreria string.h e io, sinceramente, sono un po'imbranato... Se poi qualcuno riesce a risolvere il problema che quando si mette un comando non valido fa qualcosa di "strano" (ho provato in un po di modi a risolvere, ma niente...) Beh, io la proposta l'ho lanciata; sta a voi accoglierla o rifiutarla, spero che prendiate la strada giusta...
darkjoker_________________ L'unico computer sicuro, è un computer spento. Nel software esiste sempre almeno un bug, generalmente è localizzabile tra la tastiera e la sedia  |
|  | | certaindeath Admin


Numero di messaggi: 343 Data d'iscrizione: 30.07.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 5:49 pm | |
| buono; un progretto collettivo. vediamo se insieme riusciamo a fare qualcosa di buono... _________________ è strano quante cose bisogna sapere prima di sapere quanto poco si sa...
|
|  | | darkjoker Admin


Numero di messaggi: 813 Data d'iscrizione: 30.07.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 5:52 pm | |
| speriamo... che qualcuno abbia ancora qualche interesse... come dice black, ci stiamo dividendo.... questa mi sa che è una prova definitiva prima di decidere se proseguire o no... _________________ L'unico computer sicuro, è un computer spento. Nel software esiste sempre almeno un bug, generalmente è localizzabile tra la tastiera e la sedia  |
|  | | certaindeath Admin


Numero di messaggi: 343 Data d'iscrizione: 30.07.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 5:55 pm | |
| siamo alla resa dei conti..... _________________ è strano quante cose bisogna sapere prima di sapere quanto poco si sa...
|
|  | | darkwolf membro importante


Numero di messaggi: 225 Localizzazione: Un pò più a destra ecco bravo adesso un pò più in basso perfetto abito lì Data d'iscrizione: 05.11.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 7:42 pm | |
| proseguire un corno xhack NON DEVE CHIUDERE !!!!!!!!!!!!!!!!!!!!!!!!!!! il progetto mi piace ma io non ne sono capace devo studiare di + |
|  | | giga hertz apprendista

Numero di messaggi: 42 Data d'iscrizione: 01.09.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 8:16 pm | |
| Bel progetto, credo che mi impegnerò a contribuire. PS: Ho visto che quando si inserisce un comando non supportato esce tante volte la scritta del nome utente, credo sia un bug nell while. PSS: nella calcolatrice basta dichiarare due variabili. |
|  | | BlackLight Moderatore


Numero di messaggi: 277 Età: 25 Data d'iscrizione: 22.08.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Sab Gen 05, 2008 1:31 am | |
| Dai su non è questa la giusta base da cui partire per una shell...una shell deve essere innanzitutto un componente software costruito intorno al kernel, quindi i comandi di base dovranno utilizzare quasi esclusivamente primitive del kernel, e non primitive per l'I/O ad alto livello come quelle di stdio (anche perché una shell deve essere ottimizzata il più possibile rispetto al kernel). Inoltre una buona shell deve essere completamente multiutente e multiprocesso. Ciò vuol dire che, a parte ad avere una buona gestione degli utenti, dovrà implementare pipe e redirezioni varie, che a livello utente vengono viste al solito modo (<, > e |) mentre invece a livello C sono chiusure e duplicazioni di file descriptor e creazioni di canali per la comunicazione inter-processo. Tempo fa ho implementato una mezza shell in questo modo proprio per il corso di sistemi operativi, ed è questo il consiglio che vi posso dare se volete implementare una shell simile quantomeno a quella sui sistemi Unix, non certo mettere insieme un paio di comandi C di base in un solo programmino... _________________ -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS/CM/CC/E/IT/LS/M d-(--) s:- a-- C+++$ UBL++++$ P+++ L+++++$ E- W+++ N+ o? K? w-- !O !M>+ !V PS+++ PE-- Y++ PGP+ !t !5 !X R+ tv-- b++>+++ DI? D+ G>+++ e++>++++ h r++ y+++ ------END GEEK CODE BLOCK------ | Codice: | blacklight@nightmare:/$ touch figa touch: cannot touch `figa': Permission denied |
|
|  | | darkjoker Admin


Numero di messaggi: 813 Data d'iscrizione: 30.07.07
 | Oggetto: Re: progetto per la creazione di una nuova shell... Sab Gen 05, 2008 10:04 am | |
| lol... hai ragione... ma non punto alla bash  pero, sai, mi è venuta in mente cosi, senza che essa facesse molto... bah.. prima o poi, comunque, ne faro una.. spettate e sperate...  (che poi, piu che una shell vera e propria,.... puntavo piu che altro ad un'insieme di utility, solo che mi è venuto da chiamarla shell, visto che la bash (forever  ) ne implementa un sacco di queste cose  | Citazione: | proseguire un corno xhack NON DEVE CHIUDERE !!!!!!!!!!!!!!!!!!!!!!!!!!! il progetto mi piace ma io non ne sono capace devo studiare di + |
anche noi non vorremmo chiudere, ma la community sta morendo... se leggi su annunci troverai i motivi... ci dispiace, ma stiamo seriamente pensando di andare in pensione... dipende tutto da voi...
| Citazione: | Ho visto che quando si inserisce un comando non supportato esce tante volte la scritta del nome utente, credo sia un bug nell while.
|
lo so... mi sono dannatto abbastanza per mandarlo via... l'unica cosa che ho ottenuto era... sbagliata... piu giusta ma sbagliata..._________________ L'unico computer sicuro, è un computer spento. Nel software esiste sempre almeno un bug, generalmente è localizzabile tra la tastiera e la sedia  |
|  | | | | progetto per la creazione di una nuova shell... | |
|
Argomenti simili |  |
|
| | Permesso del forum: | Non puoi rispondere agli argomenti in questo forum
| |
| |
| |