Nous avons beaucoup de caches qui ont été construits sur une machine 32 bits que nous devons maintenant lire dans un environnement 64 bits. Nous obtenons une erreur de segmentation lorsque nous voulons ouvrir lire un fichier cache.Lire des caches 32 bits dans l'environnement 64bit
Il faudra des semaines pour reproduire les caches, donc je voudrais savoir comment peut encore traiter nos fichiers de cache 32 bits sur des machines 64 bits.
Voici le code que nous utilisons pour lire et écrire nos caches:
bool IntArray::fload(const char* fname, long offset, long _size){
long size = _size * sizeof(long);
long fd = open(fname, O_RDONLY);
if (fd >0 ){
struct stat file_status;
if (stat(fname, &file_status) == 0){
if (offset < 0 || offset > file_status.st_size){
std::__throw_out_of_range("offset out of range");
return false;
}
if (size + offset > file_status.st_size){
std::__throw_out_of_range("read size out of range");
return false;
}
void *map = mmap(NULL, file_status.st_size, PROT_READ, MAP_SHARED, fd, offset);
if (map == MAP_FAILED) {
close(fd);
std::__throw_runtime_error("Error mmapping the file");
return false;
}
this->resize(_size);
memcpy(this->values, map, size);
if (munmap(map, file_status.st_size) == -1) {
close(fd);
std::__throw_runtime_error("Error un-mmapping the file");
return false;
/* Decide here whether to close(fd) and exit() or not. Depends... */
}
close(fd);
return true;
}
}
return false;
}
bool IntArray::fsave(const char* fname){
long fd = open(fname, O_WRONLY | O_CREAT, 0644); //O_TRUNC
if (fd >0 ){
long size = this->_size * sizeof(long);
long r = write(fd,this->values,size);
close(fd);
if (r != size){
std::__throw_runtime_error("Error writing the file");
}
return true;
}
return false;
}
Que contiennent ces caches? – DarkDust
Il serait intéressant que vous fournissiez les types de données en cours de lecture et la plate-forme sur laquelle vous travaillez. Dans 64 plates-formes, 'long' est en 32 bits alors que dans d'autres, il est en 64 bits, ce qui pourrait expliquer le problème. En guise de note, vous ne devriez pas appeler les méthodes qui commencent par '__' directement, car elles sont réservées pour l'implémentation et peuvent être changées à tout moment. Si vous voulez lancer un 'std :: runtime_error', faites simplement:' throw std :: runtime_error ("my_error") ' –