problema funzione getcwd()
Moderatore: Staff
Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
problema funzione getcwd()
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>
<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()
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>
<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()
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>
<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>
- useless
- Staff

- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
problema funzione getcwd()
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>
<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()
scusa useless potresti rispondere al mio secondo post<br>
problema funzione getcwd()
#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>
<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()
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>
<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()
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>
<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()
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>
<BR>Ho messo &d proprio perchè vuole un puntatore a puntatore.
<BR><br>
- useless
- Staff

- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
problema funzione getcwd()
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>
<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()
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>
<BR>comunque grazie ancora<br>
problema funzione getcwd()
scusa useless, mi sono dimenticato di chiederti come mai metti in && il puntatore d e non la stuttura info<br>
- useless
- Staff

- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
problema funzione getcwd()
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>
<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()
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>
<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>
- useless
- Staff

- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
problema funzione getcwd()
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>
<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
