| | progetto per la creazione di una nuova shell... | |
| | Autore | Messaggio |
---|
darkjoker Admin
Numero di messaggi : 813 Data d'iscrizione : 30.07.07
| Titolo: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 6: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 | |
| | | certaindeath Admin
Numero di messaggi : 343 Data d'iscrizione : 30.07.07
| Titolo: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 7:49 pm | |
| buono; un progretto collettivo. vediamo se insieme riusciamo a fare qualcosa di buono... | |
| | | darkjoker Admin
Numero di messaggi : 813 Data d'iscrizione : 30.07.07
| Titolo: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 7: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... | |
| | | certaindeath Admin
Numero di messaggi : 343 Data d'iscrizione : 30.07.07
| Titolo: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 7:55 pm | |
| siamo alla resa dei conti..... | |
| | | 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
| Titolo: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 9: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
| Titolo: Re: progetto per la creazione di una nuova shell... Ven Gen 04, 2008 10: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à : 37 Data d'iscrizione : 22.08.07
| Titolo: Re: progetto per la creazione di una nuova shell... Sab Gen 05, 2008 3: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... | |
| | | darkjoker Admin
Numero di messaggi : 813 Data d'iscrizione : 30.07.07
| Titolo: Re: progetto per la creazione di una nuova shell... Sab Gen 05, 2008 12:04 pm | |
| 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... | |
| | | Contenuto sponsorizzato
| Titolo: Re: progetto per la creazione di una nuova shell... | |
| |
| | | | progetto per la creazione di una nuova shell... | |
|
Argomenti simili | |
|
| Permessi in questa sezione del forum: | Non puoi rispondere agli argomenti in questo forum.
| |
| |
| |