Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-12-2005, 15:13   #1
Algeroth
Member
 
L'Avatar di Algeroth
 
Iscritto dal: Nov 2005
Messaggi: 70
Errore apertura file creato

//Apertura del file sala.txt

file_sala = open("sala.txt",O_RDWR|O_CREAT,0660);
if (file_sala == -1) {
printf("Errore nell'apertura del File\n");
exit(-1);
}

//Mapping del file sala.txt nello spazio di indirizzamento del processo server

int filelen = lseek(file_sala, 0, SEEK_END);
txt = (Posto*)mmap(0, filelen, PROT_READ|PROT_WRITE, MAP_SHARED, file_sala, 0);

if(txt == NULL){
printf("Mapping del file sala.txt fallito, si prega di verificare il problema\n");
exit(-1);
}


Perchè mi da errore?
Algeroth è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 15:18   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Perché non descrivi l'errore che ti da e il tipo di test che stai facendo?

nb(1) ovviamente il check su mmap è sbagliato. NULL è un valore legittimo. Se la mmap fallisce, ritorna MAP_FAILED (ovverio ~0)

nb(2) In caso di errore, usa perror. Ad es:
Codice:
	file_sala = open("sala.txt",O_RDWR|O_CREAT,0660); 
	if (file_sala == -1) { 
		perror("open");
		exit(-1); 
	}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 15:26   #3
Algeroth
Member
 
L'Avatar di Algeroth
 
Iscritto dal: Nov 2005
Messaggi: 70
l' errore che mi da è quello sul file mapping.
Ossia se mi apro il file in quella modalità mi da errore il file mapping("Mapping del file sala.txt fallito").
Se il file lo creo manualmente non mi da questo tipo di errore e tutto funziona; con quali modalità devo aprire il file o con quali devo fare il file mapping?

Ciao e grazie
Algeroth è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 15:58   #4
Algeroth
Member
 
L'Avatar di Algeroth
 
Iscritto dal: Nov 2005
Messaggi: 70
Problema risolto

Sono un imbecille

Grazie comunque a tutti
Algeroth è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 15:58   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Ti ho già detto che il confronto
if(txt == NULL)
è sbagliato; devi confrontare con MAP_FAILED. Mi sembra impossibile che, nel tuo caso, la mmap ritorna NULL comunque.

Quindi riscrivi il codice così e controlla quello che dice:
Codice:
	if(txt == MAP_FAILED){ 
		perror("mmap");
		exit(-1);
	}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 16:13   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Algeroth
l' errore che mi da è quello sul file mapping.
Ossia se mi apro il file in quella modalità mi da errore il file mapping("Mapping del file sala.txt fallito").
Se il file lo creo manualmente non mi da questo tipo di errore e tutto funziona; con quali modalità devo aprire il file o con quali devo fare il file mapping?
Confermo che se si crea (anche a mano) il file con qualcosa dentro, il codice funziona. Se invece il file lo fai creare alla open, il file avrà lunghezza 0 e per questo motivo la mmap ti restituisce NULL. Quindi si dovrebbe testare se il puntatore restituito è diverso da MAP_FAILED e da NULL.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 08:30   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Non sapevo che mmap ritornasse NULL se la regione da mappare ha dimensione 0. Molto astuto, così becchi subito accessi erronei da parte del codice.

Quote:
Quindi si dovrebbe testare se il puntatore restituito è diverso da MAP_FAILED e da NULL.
Non sono c'accordo, basta testare MAP_FAILED. Il codice deve essere fatto per accedere al massimo alla dimensione della mappatura; quindi una regione di grandezza 0 non dovrebbe essere mai acceduta. Se provi a farlo è un bug, e ti becchi un meritato segmentation fault.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 09:25   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ilsensine
Non sono c'accordo, basta testare MAP_FAILED. Il codice deve essere fatto per accedere al massimo alla dimensione della mappatura; quindi una regione di grandezza 0 non dovrebbe essere mai acceduta. Se provi a farlo è un bug, e ti becchi un meritato segmentation fault.
Allora... MAP_FAILED, da quanto ho potuto vedere, è definito come ((void*) -1). Quindi, tradotto come un indirizzo, sarebbe 0xFFFFFFFF. È chiaro che né NULL (0x0), né MAP_FAILED sono indirizzi validi e tantomeno accessibili.
Sul fatto, come dici tu, che una regione di grandezza 0 non dovrebbe essere acceduta, è vero ma dipende da cosa ci devi fare.

Supponiamo:

Codice:
int filelen = lseek (...);
txt = (Posto*)mmap (...); 

if (txt != MAP_FAILED)
{
    for (i=0; i<filelen; i++)
    {
        ...utilizzo di txt...
    }
}
In questo caso se filelen è 0, txt non verrà mai usato, quindi non ci sono problemi. Ma supponi che invece del ciclo for, devi usare txt in una memcpy. Otterresti un bel segmentation fault!
Quindi o ti fai un exception handling (non so come ma in qualche modo), oppure testi se txt è NULL, oppure ancora, più a monte, testi se filelen è zero e a questo punto non fai neanche la mmap e fai altro.

Tra l'altro mi sembra stupido che la mmap possa restituire MAP_FAILED (-1). Tutte le principali funzioni (almeno che io conosco) che restituiscono un puntatore, ritornano un NULL in caso di errore (es. malloc, strchr, strstr, fgets, ecc...).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 09:44   #9
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
goku@big:/tmp$ cat mmap_test.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(void)
{
        int filelen;
        void *map;
        int fd = open("sala.txt", O_RDWR | O_CREAT, 0660);
        if (fd == -1) {
                perror("open()");
                exit(1);
        }
        filelen = lseek(fd, 0, SEEK_END);
        map = mmap(0, filelen, PROT_READ | PROT_WRITE, MAP_SHARED,
                           fd, 0);
        if (map == MAP_FAILED) {
                perror("mmap()");
                close(fd);
                exit(1);
        }
        puts("mapped file!");
        close(fd);
        munmap(map, filelen);

        return 0;
}
goku@big:/tmp$ gcc mmap_test.c -o mmap_test -Wall
goku@big:/tmp$ ./mmap_test
mmap(): Invalid argument
goku@big:/tmp$ echo pinocchio ha fatto colazione >>sala.txt
goku@big:/tmp$ ./mmap_test
mapped file!
goku@big:/tmp$
Mi sembra vada tutto bene: uno degli argomenti (a occhio la lunghezza 0) non viene accettato.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 10:03   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Qu@ker
Mi sembra vada tutto bene: uno degli argomenti (a occhio la lunghezza 0) non viene accettato.
mumble... su che distribuzione linux??? A me, se la lunghezza del file è zero, la mmap restituisce NULL e non MAP_FAILED (ho provato su una "vecchia" Caldera eDesktop 2.4 e su una Slackware 9.1).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 10:42   #11
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Quote:
Originariamente inviato da andbin
mumble... su che distribuzione linux???
Slackware 10.2 (kernel 2.6.14.2).
Per curiosita' ho provato anche su una Gentoo aggiornata con lo stesso risultato postato sopra.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 10:51   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da andbin
Allora... MAP_FAILED, da quanto ho potuto vedere, è definito come ((void*) -1). Quindi, tradotto come un indirizzo, sarebbe 0xFFFFFFFF. È chiaro che né NULL (0x0), né MAP_FAILED sono indirizzi validi e tantomeno accessibili.
NULL è un indirizzo valido. Conosco almeno un programma che ci mappa memoria.

Quote:
Supponiamo:

Codice:
int filelen = lseek (...);
txt = (Posto*)mmap (...); 

if (txt != MAP_FAILED)
{
    for (i=0; i<filelen; i++)
    {
        ...utilizzo di txt...
    }
}
In questo caso se filelen è 0, txt non verrà mai usato, quindi non ci sono problemi. Ma supponi che invece del ciclo for, devi usare txt in una memcpy. Otterresti un bel segmentation fault!
Una memcpy con numero di byte 0 non fa nulla, quindi non ottieni nessun segfault.

Quote:
Tra l'altro mi sembra stupido che la mmap possa restituire MAP_FAILED (-1). Tutte le principali funzioni (almeno che io conosco) che restituiscono un puntatore, ritornano un NULL in caso di errore (es. malloc, strchr, strstr, fgets, ecc...).
Esegui questo programma e fammi sapere il tuo risultato:
Codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>

int main(int argc, char **argv) {
	char *map = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE,
		MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
	if(map==MAP_FAILED) {
		perror("mmap");
		exit(-1);
	}
	sprintf(map, "sto scrivendo all'indirizzo 0x%08lx!!\n", (unsigned long) map);
	write(fileno(stderr), map, strlen(map));
	return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 11:31   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ilsensine
Una memcpy con numero di byte 0 non fa nulla, quindi non ottieni nessun segfault.
Sì, ovvio, se usi come lunghezza 0 nella memcpy. Io dicevo in generale, ho detto memcpy per fare un esempio ma se invece fai una strchr, siamo daccapo: segmentation fault.

Quote:
Originariamente inviato da ilsensine
Esegui questo programma e fammi sapere il tuo risultato:
Codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>

int main(int argc, char **argv) {
	char *map = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE,
		MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
	if(map==MAP_FAILED) {
		perror("mmap");
		exit(-1);
	}
	sprintf(map, "sto scrivendo all'indirizzo 0x%08lx!!\n", (unsigned long) map);
	write(fileno(stderr), map, strlen(map));
	return 0;
}
In effetti mi scrive "sto scrivendo all'indirizzo 0x00000000!!".

Desidero precisare che pur conoscendo di nome la funzione mmap(), non l'avevo mai usata (prima di fare le prove per questo thread). Quindi per evitare di "fare notte" vorrei precisare che:

1) Il puntatore NULL (0x0) è, per definizione, un puntatore non valido, usato oltretutto da una caterba di funzioni per segnalare un errore. L'accesso all'indirizzo 0x0 causa quindi, generalmente, un segmentation fault.

2) Che esista una funzione "particolare" come la mmap (che opera a livello di sistema sulla mappatura della memoria) solo sui sistemi Linux/Unix e che ti mappa un blocco di memoria all'indirizzo 0x0 ... beh, questa, come direbbe qualcuno ... è un'altra storia! Non lo sapevo ma posso capirlo e mi può stare bene.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 11:43   #14
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da andbin
1) Il puntatore NULL (0x0) è, per definizione, un puntatore non valido, usato oltretutto da una caterba di funzioni per segnalare un errore. L'accesso all'indirizzo 0x0 causa quindi, generalmente, un segmentation fault.
Questo perché è una ovvia convenzione stabilire che un allocatore di memoria restituisca "0" in caso di errore. La mmap però non è un semplice allocatore di memoria; ti consente di fare quello che vuoi con i tuoi indirizzi _virtuali_ (0 incluso!)

Il fatto che all'indirizzo 0 ci puoi trovare "qualcosa di valido", non è una semplice alchimia del mio programmino. Gli x86 in modalità reale, se non ricordo male, hanno il vettore di interruzioni all'indirizzo 0 (verificabile tramite qualsiasi DOS); alcuni processori hanno memoria _fisica_ di un qualche tipo all'indirizzo 0 (ad es. lo StrongARM ha la flash), che coincide con la memoria vista dal programma se operi senza mmu. In queste situazioni, se scrivi su NULL non ottieni necessariamente un segfault (forse qualcosa di meno divertente )
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 12:06   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ilsensine
Questo perché è una ovvia convenzione stabilire che un allocatore di memoria restituisca "0" in caso di errore. La mmap però non è un semplice allocatore di memoria; ti consente di fare quello che vuoi con i tuoi indirizzi _virtuali_ (0 incluso!)
Sono d'accordo con te.

Quote:
Originariamente inviato da ilsensine
Il fatto che all'indirizzo 0 ci puoi trovare "qualcosa di valido", non è una semplice alchimia del mio programmino. Gli x86 in modalità reale, se non ricordo male, hanno il vettore di interruzioni all'indirizzo 0 (verificabile tramite qualsiasi DOS); alcuni processori hanno memoria _fisica_ di un qualche tipo all'indirizzo 0 (ad es. lo StrongARM ha la flash), che coincide con la memoria vista dal programma se operi senza mmu. In queste situazioni, se scrivi su NULL non ottieni necessariamente un segfault (forse qualcosa di meno divertente )
Anche questo è vero. Non conosco gli StrongARM ma mi ricordo benissimo (e quanto ci ho lavorato...) che nel MSDOS (modalità reale quindi), all'indirizzo 0 c'era la tabella degli interrupt. E andare a scriverci lì sopra per sbaglio era ... molto divertente!

Quindi per riassumere. Il puntatore NULL per convenzione non è valido, ed è quindi buona norma testare puntatori, ecc... prima dell'utilizzo.
La mmap() e architetture hardware particolari sono da trattare a parte.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2005, 12:26   #16
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da andbin
Sì, ovvio, se usi come lunghezza 0 nella memcpy. Io dicevo in generale, ho detto memcpy per fare un esempio ma se invece fai una strchr, siamo daccapo: segmentation fault.
mmm mi ero perso questo...
un strchr su una regione ottenuta con mmap è un bug, a meno che non hai verificato preventivamente (ad es. con strnlen) che la regione termina con '\0'. Puoi andare in segfault anche se il file non è vuoto; basta che sia allineato alla pagina, non contenga zeri, e non contenga il carattere che stai cercando con strchr.

Per queste applicazioni (ovvero con dati forniti "dall'esterno", ad es. letti da un file) meglio memchr.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Black Myth: Wukong, oggi un maxi aggiorn...
Nomad in missione senza alcun controllo ...
Apple prepara il chip H3 e nuovi AirPods...
Battlefield 6 è uno spettacolo an...
Hyundai Ioniq 9, prima prova: viaggiare ...
Allarme blackout in Spagna: la rete elet...
MindsEye, rivolta dei dipendenti contro ...
In Cina Xiaomi SU7 Ultra prende fuoco do...
Apple Smart Glass: display integrato e d...
Mortal Kombat 3 si farà: la confe...
iPhone 18 Pro: prime indiscrezioni sulle...
Vai all'università? Hai un anno d...
Rubrik accelera su IA e sicurezza: tra c...
Nuovo Nothing Phone (3) in offerta su Am...
Roborock Qrevo Edge in offerta su Amazon...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v