PDA

Visualizza la versione completa : Impossibile leggere da stdin con una fgets da dentro un thread..!


galele87
17-06-2010, 15:56
Salve a tutti,
pongo un problema alquanto strano.. da main io do vita ad un thread incaricato di leggere dallo standard input. Queste letture gliele faccio fare con una fgets() ma, ovviamente, non mi funge.. ^^
L'eccezione a runtime è la seguente:
*** glibc detected *** ./msgcli: munmap_chunk(): invalid pointer: 0xbfc64570 ***

Posto il pezzetto di codice della funzione che esegue il thread alla creazione:


static void* senderJob(void *arg) {
char line[MESSAGE_MAX_LENGTH];

while(1) {
if(fgets(line, MESSAGE_MAX_LENGTH, stdin) == NULL) SEND_EXIT(1, "Error while reading from standard input")
...
}


Ho verificato che il problema si verifica proprio per colpa di 'stdin'... I thread di un medesimo processo non condividono tutti la tabella dei file aperti?
Non dovrebbe essere un problema, quindi, poter leggere da standard input...

Qualcuno ha qualche idea brillante?? :master:

Thanks a lot...

galele87
17-06-2010, 16:57
Info aggiuntive:

Sono su kubuntu.. per la creazione del thread utilizzo la system call relativa ai thread POSIX pthread_create().

galele87
17-06-2010, 18:17
La versione del kernel di ubuntu è 2.6.31-19, mentre la versione del compilatore è
- gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

alka
17-06-2010, 19:30
Se ci sono altri dati che devi fornire, per favore indicali tutti in una volta, senza aggiungerne un pezzo regolarmente ogni 1/2 ore... :fagiano:

YuYevon
17-06-2010, 19:38
Ma comunque non si può dire nulla da quelle poche righe di codice, e poi il problema sembra riguardare un tentativo di deallocazione di memoria tentata su un puntatore non valido (appunto l' "invalid pointer"). Sei sicuro di aver individuato che l'errore sia lì? Il codice intero è troppo lungo per essere controllato?

galele87
17-06-2010, 19:50
Ciao..
sì, sono particolarmente sicuro che il problema sia proprio lì.. e NON è la fgets(), in quanto riscontro il medesimo problema anche con la fgetc(), la fscanf()... ed è proprio 'stdin' il vero problema..

Grazie che almeno mi hai risposto.. ho perso un pomeriggio per cercare di trovare soluzione a questo problema.. e ancora niente..

oregon
17-06-2010, 20:40
A me sembra più un errore di "heap" ... (malloc/free che danno problemi ...)

galele87
17-06-2010, 20:49
Ok, trovato..
chiedo scusa a tutti per avervi fatto perdere tempo.. in effetti il problema era una free ma non era dentro al thread.. ma nel thread main..

Grazie a chi mi ha aiutato e mi ha fatto notare pian piano l'errore..
Scusate di nuovo.

oregon
17-06-2010, 20:52
Originariamente inviato da galele87
in effetti il problema era una free ma non era dentro al thread.. ma nel thread main..

Ecco ... :mame:


Scusate di nuovo.

Di nulla ... non capisco perché ti eri fissato con lo stdin, poverino ... :)

galele87
17-06-2010, 20:59
Di nulla ... non capisco perché ti eri fissato con lo stdin, poverino ... :)

Ehehe.. perchè da bravo scemo, usando delle stampe a video sceme per fare un debug scemo, ogni volta mi fermavo sulla fgets()...

e intanto era il main thread che sollevava l'eccezione..

mi sento un pò.. scemo? :mem:

P.s. per punizione scrivo su un foglio 100 volte "Io e il parallelismo non andiamo d'accordo" :D

Loading