Pagina 1 di 1
problema funzione getcwd()
Inviato: lun 18 ott 2004, 17:56
da null
salve ragazzi, ho scritto il seguente codice:
<BR>
<BR>#include <stdio.h>
<BR>
<BR>int main(void){
<BR>
<BR> char *buff;
<BR> size_t SIZE = 50;
<BR>
<BR> getcwd(buff,SIZE);
<BR>
<BR> printf("%s\n",buff);
<BR>
<BR> return 0;
<BR>}
<BR> e mi ha dato questo output in output prima la directory corrente (ed è quello che mi dovrebbe dare) e poi mi dice segmentation fault ( e non capisco il perchè). Qualcuno di voi saprebbe aiutarmi?
<BR>Grazie <br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 18:10
da null
mi sono dimenticato una cosa:
<BR>
<BR>la funzione getwcd(char *BUFFER, size_t SIZE) memorizza in BUFFER la directory corrente, ma si dovrebbe anche specificare la grandezza SIZE del BUFFER.
<BR>Ho letto che per evitare problemi di buffer overflow si potrebbe far puntare BUFFER a NULL e mettere SIZE a 0. Ma come si fa a far puntare BUFFER a NULL?<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 18:15
da meritil
prova così:
<BR>
<BR>int main(void){
<BR>
<BR>char buff[50];
<BR>size_t SIZE = 50;
<BR>
<BR>getcwd(buff,SIZE);
<BR>
<BR>printf("%s\n",buff);
<BR>
<BR>return 0;
<BR>}
<BR>
<BR>oppure :
<BR>
<BR>int main(void){
<BR>
<BR>char * buff;
<BR>size_t SIZE = 50;
<BR>
<BR>buff=(char*) malloc (sizeof(char) * 50);
<BR>getcwd(buff,SIZE);
<BR>
<BR>printf("%s\n",buff);
<BR>
<BR>return 0;
<BR>}
<BR>
<BR>Ciao<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 18:27
da useless
soluzione migliore:
<BR>
<BR>#define SIZE 50
<BR>
<BR>int main(void){
<BR>char buff[SIZE];
<BR>
<BR>getcwd(buff,SIZE);
<BR>printf("%s\n",buff);
<BR>
<BR>return 0;
<BR>}
<BR>
<BR>il tuo segfault è dovuto al fatto di non allocare una stringa (vettore di char), ma solo un puntatore, così quando la funzione getcwd prova a scrivere in memoria sovrascrive dati che non dovrebbe.
<BR>
<BR><!-- BBCode Start --><A HREF="
http://www.danasoft.com" TARGET="_blank"><!-- BBCode Start --><IMG SRC="
http://www.danasoft.com/sig-ita.jpg"><!-- BBCode End --></A><!-- BBCode End -->
<BR>Think free @ <!-- BBCode Start --><A HREF="
http://www.nyft.org" TARGET="_blank">http://www.nyft.org</A><!-- BBCode End -->
<BR><BR><BR>[ Questo Messaggio è stato Modificato da: useless il 18-10-2004 18:27 ]<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 18:53
da null
scusa useless potresti rispondere al mio secondo post<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 19:24
da meritil
#include <stdio.h>
<BR>#include <unistd.h>
<BR>
<BR>int main (int argc, char ** args){
<BR> char * buff;
<BR>
<BR> if((buff=getcwd(NULL,0))==NULL) return EXIT_FAILURE;
<BR> printf("%s\n",buff);
<BR> free(buff);
<BR> return EXIT_SUCCESS;
<BR>
<BR>}
<BR>
<BR>La versione posix di getcwd ti consente di non specificare la grandezza di buff e nemmeno di allocarlo fa tutto da solo attraverso una malloc wrappata dentro getcwd() chiaramente devi deallocare buff prima di uscire..
<BR>In poche parole la stringa te la crea getcwd, a te serve solo un puntatore ad essa per utilizzarla... visto che te la crea getcwd con una malloc a te e demandato il compito di deallocarla. (con la free())
<BR>
<BR>Ciao Meritil
<BR>
<BR>ps:"Far puntare buff a NULL" significa passare NULL...<BR><BR>[ Questo Messaggio è stato Modificato da: meritil il 18-10-2004 19:38 ]<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 19:31
da null
ok meritil, ti ringrazio.
<BR>Colgo anche l´occasione per farti vedere questo codice:
<BR>
<BR>#include <stdio.h>
<BR>#include <stdlib.h>
<BR>#include <dirent.h>
<BR>
<BR>int main(int argc, char *argv[]){
<BR>
<BR> struct dirent info,*d;
<BR> DIR *dir;
<BR>
<BR> if(argc != 2){
<BR> printf("ERRORE: uso %s dir-name\n",*argv);
<BR> return 0;
<BR> }
<BR>
<BR> if((dir = opendir(*++argv)) == NULL){
<BR> printf("Non posso aprire la directory\n");
<BR> return 0;
<BR> }
<BR>
<BR> while(readdir_r(dir,&info,&d) == 0)
<BR> printf("%s\n",d->d_name);
<BR>
<BR> closedir(dir);
<BR>
<BR> return 0;
<BR>}
<BR>
<BR>Come output mi da la lista dei file che contiene la directory che gli passo come argomento, ma alla fine mi da sempre segmentation fault.
<BR>Sapresti come aiutarmi e spiegrami il problema?
<BR>
<BR><br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 20:02
da meritil
Allora io ti propongo come farei io...
<BR>
<BR>#include
<BR>#include
<BR>#include
<BR>
<BR>int main(int argc, char *argv[]){
<BR>
<BR>struct dirent *d;
<BR>DIR *dir;
<BR>
<BR>if(argc != 2){
<BR>printf("ERRORE: uso %s dir-name\n",*argv);
<BR>return 0;
<BR>}
<BR>
<BR>if((dir = opendir(args[1])) == NULL){
<BR>printf("Non posso aprire la directory\n");
<BR>return 0;
<BR>}
<BR>
<BR>while((d=readdir(dir)) != NULL)
<BR>printf("%s\n",d->d_name);
<BR>
<BR>closedir(dir);
<BR>
<BR>return 0;
<BR>}
<BR>
<BR>
<BR>Il tuo codice ora non ho modo di provarlo sono a casa di un amico con winz quindi niente compilatore

((
<BR>Però a prima vista potrebbe essere l´ & prima di d essendo un puntatore puoi passarlo diretto, l´& posto prima passa il puntatore al puntatore a d... appena sono a casa provo e ti faccio sapere con certezza cmqe man readdir_r e controlla i tipi dei paramentri e te ne accorgi da solo dove sbagli...
<BR><BR><BR>[ Questo Messaggio è stato Modificato da: meritil il 18-10-2004 20:04 ]<br>
problema funzione getcwd()
Inviato: lun 18 ott 2004, 20:05
da null
il problema è che con readdir(DIR *) funziona, ma conla funzione readdir_r(DIR *,struct dirent *,struct dirent **) non funziona.
<BR>Ho messo &d proprio perchè vuole un puntatore a puntatore.
<BR><br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 0:33
da useless
il modo giusto x verificare se si è alla fine della dir o meno è:
<BR>while(readdir_r(dir,&info,&d) == 0 && d)
<BR>
<BR>questo xké alla fine della directory d viene impostato a NULL, ma readdir_r ritorna ancora 0, e quindi come hai fatto tu la printf viene chiamata ancora una volta dopo l´ultimo elemento, passandole un puntatore a NULL, che genera il sigsegv.
<BR>
<BR>in realtà questo codice non tiene conto dei possibili errori che si possono verificare. se se ne verifica uno è come se la dir fosse finita.
<BR>
<BR>dove hai trovato sta funzione? nel mio man non c´è! c´è solo la readdir non thread-safe!
<BR>
<BR><!-- BBCode Start --><A HREF="
http://www.danasoft.com" TARGET="_blank"><!-- BBCode Start --><IMG SRC="
http://www.danasoft.com/sig-ita.jpg"><!-- BBCode End --></A><!-- BBCode End -->
<BR>Think free @ <!-- BBCode Start --><A HREF="
http://www.nyft.org" TARGET="_blank">http://www.nyft.org</A><!-- BBCode End -->
<BR><BR><BR>[ Questo Messaggio è stato Modificato da: useless il 19-10-2004 00:34 ]<br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 0:50
da null
l´ho trovata in un manuale di C, si chiama "Imparare il C una guida per linux". E´ reperiribile in rete.
<BR>comunque grazie ancora<br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 0:58
da null
scusa useless, mi sono dimenticato di chiederti come mai metti in && il puntatore d e non la stuttura info<br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 1:07
da useless
xké info ha un indirizzo ben preciso, locale a main, che viene stabilito quando lo dichiari:
<BR>struct dirent info;
<BR>
<BR>successivamente readdir si limita a modificarne il contenuto, e ritorna il suo indirizzo in d, oppure ritorna NULL quando qualcosa è andato storto, e se non facesse questo non potresti accorgertene solo guardando il contenuto di info.
<BR>
<BR>se readdir dovesse modificare l´indirizzo di info avrebbe bisogno un ptr a un ptr.<br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 3:46
da meritil
Curioso che alla fine della directory imposti d a null ma restituisca cmqe 0 che a quanto leggo dal manuale significa "lettura eseguita con successo", cioè è come se dicesse "ho letto un cavolo con successo" eheh..
<BR>Bah.. scriverlo in fondo al man risparmierebbe inutili giretti con gdb...
<BR>
<BR>Ciao.
<BR>
<BR>ps: Che ambiente usate per programmare in C ? Io sto cercando disperatamente CodeWarrior, su windows mi ci trovavo benissimo.. Sapete se esiste una cosa del genere per Linux?<br>
problema funzione getcwd()
Inviato: mar 19 ott 2004, 8:45
da useless
mah, in effetti hai ragione, xò mi sa che dobbiamo prendere 0 come "non c´è stato nessun errore". certo, è un po´ fuorviante, anche xké bisogna smenettare con errno x capire se è successo qualcosa o meno.
<BR>poi comunque ribadisco che io nel man manco ce l´ho readdir_r

.
<BR>
<BR>quanto all´IDE: ho usato anjuta x un po´ (era l´unico programma x cui installavo le librerie di gnome!), poi sono passato a kdevelop, che un annetto fa mi aveva fatto letteralmente schifo, ma che da allora fortunatamente è molto migliorato.
<BR>un´alternativa è eclipse, quel "coso" che si usa solitamente x programmare in java, x il quale xò esiste anche un plugin (CDT mi pare) x sviluppare in c/c++.
<BR>altrimenti c´è sempre emacs

.<br>