|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
grosso problema con prog. C (per veri esperti)
salve ragazzi devo fare un progetto di scuola..
il progetto si tratta di questo: progetto la parte in bash e gestore lo fatta tutto ok... l'unico problema che ho è la gestione delle directory.... qualcuno mi sa aiutare non riesco a venirne fuori.... Codice:
# #include "vd.h" extern int get_first_free_inode(); extern void write_inode(int, inode*); extern void read_inode(int, inode*); extern void write_file_block(int, char*); extern void read_file_block(int, char*); /* * */ int get_inode_number(char *path) { /* Verifico se path e' una directory (ultimo carattere == '/') */ int l = strlen(path); if(*(path+l-1)=='/') { } /* E' stato passato un nome di file */ else { } /* Percorso non valido */ return -1; } /* * */ void create_dir(char *name) { inode i; i.id = get_first_free_inode(); i.type = TYPE_DIR; memcpy(&i.name[0], name, MAX_NAME_LENGTH); i.size = 0; write_inode(i.id, &i); } /* * */ void cp_to_vd(char *src, char *dst) { int src_fd = open(src,O_RDONLY); int src_size = lseek(src_fd,0,SEEK_END); lseek(src_fd,0,SEEK_SET); char file_data[BLOCK_SIZE]; read(src_fd, &file_data[0], src_size); inode i; i.id = get_first_free_inode(); i.type = TYPE_FILE; memcpy(&i.name[0], dst, MAX_NAME_LENGTH); i.size = src_size; write_inode(i.id, &i); write_file_block(i.id, &file_data[0]); } /* * */ void cp_from_vd(char *src, char *dst) { int dst_fd = open(dst, O_WRONLY|O_TRUNC|O_CREAT); inode i; char data[BLOCK_SIZE]; read_inode(1, &i); read_file_block(1,&data[0]); write(dst_fd, &data[0], i.size); close(dst_fd); } /* * */ void list_inodes() { int i; inode in; printf("Lista degli inode:\n"); for(i=0; i<MAX_INODES; i++) { read_inode(i, &in); switch(in.type) { case TYPE_DIR: printf("(%d) '%s', directory con %d file\n",in.id,&(in.name[0]),in.size); break; case TYPE_FILE: printf("(%d) '%s' file di %d bytes\n",in.id, &(in.name[0]), in.size); break; case TYPE_EMPTY: printf("(%d) libero\n", in.id); break; default: printf("(%d) tipo '%c' ???\n", in.id, in.type); break; } } } se vi servono altri pezzi di codice fatemi sapere... casomai ci possiamo sentire per mail o per msn... un grazie gigantesco a chi mi aiuta!!
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
raga nessuno sa aiutarmi??
vi prego aiutatemi è molto importante!!
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
"per veri esperti"...?
![]() comunque mi sa che ti sei scordata di chiedere quello che volevi chiedere ![]() Ultima modifica di 71104 : 02-07-2006 alle 18:02. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
non funziona la gestione delle directory....ho scritto per veri esperti per attirare la gente brava...
spero tu sia bravo e pos aiutarmi...
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
"non funziona la gestione delle directory" é un pó troppo vago.
Io continuo ad avere tempo da perdere (finché mi pagano ![]() quindi se vuoi ti aiuto (se sono abbastanza bravo) ma dovresti essere piú precisa e postare anche i files mancanti ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
questi sono gli altri pezzi di codice....
Codice:
#include "vd.h" extern int get_first_free_inode(); extern void write_inode(int, inode*); extern void read_inode(int, inode*); extern void write_file_block(int, char*); extern void read_file_block(int, char*); /* * */ int get_inode_number(char *path) { /* Verifico se path e' una directory (ultimo carattere == '/') */ int l = strlen(path); if(*(path+l-1)=='/') { } /* E' stato passato un nome di file */ else { } /* Percorso non valido */ return -1; } /* * */ void create_dir(char *name) { inode i; i.id = get_first_free_inode(); i.type = TYPE_DIR; memcpy(&i.name[0], name, MAX_NAME_LENGTH); i.size = 0; write_inode(i.id, &i); } /* * */ void cp_to_vd(char *src, char *dst) { int src_fd = open(src,O_RDONLY); int src_size = lseek(src_fd,0,SEEK_END); lseek(src_fd,0,SEEK_SET); char file_data[BLOCK_SIZE]; read(src_fd, &file_data[0], src_size); inode i; i.id = get_first_free_inode(); i.type = TYPE_FILE; memcpy(&i.name[0], dst, MAX_NAME_LENGTH); i.size = src_size; write_inode(i.id, &i); write_file_block(i.id, &file_data[0]); } /* * */ void cp_from_vd(char *src, char *dst) { int dst_fd = open(dst, O_WRONLY|O_TRUNC|O_CREAT); inode i; char data[BLOCK_SIZE]; read_inode(1, &i); read_file_block(1,&data[0]); write(dst_fd, &data[0], i.size); close(dst_fd); } /* * */ void list_inodes() { int i; inode in; printf("Lista degli inode:\n"); for(i=0; i<MAX_INODES; i++) { read_inode(i, &in); switch(in.type) { case TYPE_DIR: printf("(%d) '%s', directory con %d file\n",in.id,&(in.name[0]),in.size); break; case TYPE_FILE: printf("(%d) '%s' file di %d bytes\n",in.id, &(in.name[0]), in.size); break; case TYPE_EMPTY: printf("(%d) libero\n", in.id); break; default: printf("(%d) tipo '%c' ???\n", in.id, in.type); break; } } } Codice:
#include "vd.h" int main() { int done=0; /* Inizializzo il disco */ if (vdserver_init(&done)<0) return -1; /* Mando in background il processo */ int pid = fork(); /* Processo figlio */ if(pid==0) { int pipe_fd; char cmd[MAX_CMD_LENGTH]; int ncar; /* Loop principale */ while(!done) { pipe_fd=open("pipe",O_RDONLY); /* Leggo comando dalla pipe */ ncar=read(pipe_fd,&cmd[0],MAX_CMD_LENGTH); cmd[ncar]='\0'; /* Eseguo il comando */ vdserver_exec_cmd(cmd); /* Ripulisco l'array altrimenti contiene spazzatura ???????? */ int i; for(i=0;i<MAX_CMD_LENGTH;i++) cmd[i]='\0'; /* Chiudo la pipe */ close(pipe_fd); } /* Figlio terminato */ return 0; } /* Fine processo padre */ printf("vdserver in esecuzione con PID %d\n",pid); return 0; } Codice:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> /* Tipi di inode */ #define TYPE_DIR 'd' #define TYPE_FILE 'f' #define TYPE_LINK 'l' #define TYPE_EMPTY 'e' #define TYPE_PURGED 'p' /* Numero di inode gestiti */ #define MAX_INODES 3 /* Dimensione blocchi dati in byte */ #define BLOCK_SIZE 32 /* Lunghezza massima di un nome file/directory */ #define MAX_NAME_LENGTH 11 /* Nome del file che ospita il disco virtuale */ #define DISK_FILENAME "disk" /* Lunghezza massima di un comando inviato alla pipe */ #define MAX_CMD_LENGTH 1000 /* * Struttura di un inode */ typedef struct { int id; char type; char name[MAX_NAME_LENGTH+1]; int size; } inode; /* * */ int vdserver_init(int *p); void vdserver_exec_cmd(char cmd[MAX_CMD_LENGTH]); e questo è il gestore che lo fa partire: Codice:
#!/bin/bash #qui potrei mettere tipo PATH= tutti i file bash che trattano i commandi.... SERVER_COMMAND="vd.c" DIRSERVER="$HOME/Deskop/sob" #directory dove si trova il server SERVER_ID_FILE="/tmp/.server.tmp" #directory temporanea if [ $# != 1 ] ; then echo "Gestore: Usage vd: {start|stop}" exit 1 fi case "$1" in start) $DIRSERVER/$SERVER_COMMAND & #esegue il server echo "$!" > $SERVER_ID_FILE;; stop) PID=$(cat $SERVER_ID_FILE) #salva il pid kill -SIGUSR1 $PID #killa il pid rm $SERVER_ID_FILE;; *) echo "Gestore: Usage vd: {start|stop}" exit 1;; esac exit 0; mi da una serie di errori sul primo codice che ho postato... in particolare mi dice: line 7: /bin is a directory line 8 int: command not found line 10 /bin is a directory line 11 int: command not found line 13 bin is a directoy line 14 int: command not found line 17 bin is a directoy line 18 disk: command not found line 19 */ no such file o directory line 20 sintax error near unespected token ( line 20 int get first free inode() { perchè non funziona?cosa ce di sbagliato? grazie infinite a chi mi sa aiutare...
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
"vd" é una bash shell ed ha un parametro obbligatorio <start|stop>
col quale fai partire o fermare il server imposta la variabile Codice:
SERVER_COMMAND="vd.c" nome. Prima lo devi compilare facendo: Codice:
cc vd.c -o vd se non hai errori (dubito ![]() quindi cambi: Codice:
SERVER_COMMAND="vd"
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
ciao il codice è fato in modo di partire senza il file bash...
ho capito cmq l'errore e te ne sono grato... pero resta cmq sbagliato.. quando passo i comandi tramite le pipe se sono directory mi va a scrivere porcheria nel disco... ma non capisco perchè...
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() ![]() Quote:
Codice:
Simbolo referenziato per primo non definito nel file get_first_free_inode vd.o vdserver_init vd.o read_file_block vd.o vdserver_exec_cmd vd.o write_inode vd.o read_inode vd.o write_file_block vd.o ld: errore fatale:Errori di referenziazione dei simboli. Nessun output scritto in vd
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
ciao
cosa intendi che ti mancanbo parecchie funzioni?? il codice è tutto li... non capisco cosa ce di sbagliato... sui file funziona sulle directory no...
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Per esempio la funzione "get_first_free_inode" io non ce l'ho sulla mia macchina, ne il sorgente per crearla. Una funzione come la "printf" é standard quindi quando compili il tuo eseguibile non devi dire al compilatore dov'é, lo sa giá, e la "linka". Ma la "get_first_free_inode" non é standard quindi dovrei dire al compilatore dove andarla a cercare. Nel tuo caso la "read_inode" é (se ho letto bene) la funzione che legge il file trovato ed é dichiarata: Codice:
extern void read_inode(int, inode*); ma in un altro. Secondo me se cerchi bene lo trovi ![]() Mi spiace ma cosí senza codice non si capisce molto dove possa essere il problema. Anzi, non si capisce quale sia il problema ... Non é solo un problema di directory o non directory: Quote:
![]() Mi sa che non potendo andare sul sito del progetto c'é qualcosa che non capisco. Ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 1218
|
perchè non puoi andare sul sito del progetto??
è questo: sito progetto vai su formazioni gruppo e progetto a sinistra della pagina li ce la spiegazione in vari formati delprogetto..
__________________
Athlon64 3500 (Winchester), Asus A8V-E Deluxe, X700Pro 256MB, Maxtor 200GB Sata,Ali Enermax 400W, Mast. Pionner 109,Lettore dvd LG, Creative 2.1 3200, LG 1980q, Canon Pixma mp500. |
![]() |
![]() |
![]() |
#13 | ||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
![]() EDIT: e non chiedermi perché su hwupgrade ci posso andare ... non lo so ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:50.