2016-10-09 4 views
1

Lorsque j'ai réalisé ce projet pour la première fois le semestre dernier, le code fonctionnait correctement. Maintenant, je reçois une erreur de bus lorsque la mémoire mmapped à partager entre les processus est en cours d'écriture et je ne sais pas pourquoi cela ne fonctionne plus.Erreur de bus lors de l'écriture de données mmaped

Account_Info *mapData() 
{ 
    int fd; 
    //open/create file with read and write permission and check return value 
    if ((fd = open("accounts", O_RDWR|O_CREAT, 0644)) == -1) 
    { 
      perror("Unable to open account list file."); 
      exit(0); 
    } 

    //map data to be shared with different processes 
    Account_Info *accounts = mmap((void*)0, (size_t) 100*(sizeof(Account_Info)), PROT_WRITE, 
    MAP_SHARED, fd, 0); 

    int count= 0; 

    //loop to initialize values of Account_Info struct 
    while (count != 20) 
    { 
      //bus error occurs here 
      accounts[count].CurrBalance= 0; 
      accounts[count].flag = 0; 
      int i = 0; 
      while (i != 100) 
      { 
        //place NULL terminator into each element of AccName 
        accounts[count].AccName[i]= '\0'; 
        i++; 
      } 

      count++; 
    } 

    close(fd); 
    return accounts; 
} 

Répondre

2

Une cause documentée pour SIGBUS avec mmap est

Tentative d'accès à ap oution du tampon qui ne correspond pas au fichier (par exemple, au-delà de la fin du fichier, y compris le cas où un autre processus a tronqué le fichier).

Je pense que le fichier accounts n'existait pas, si open avec O_CREAT créé. Mais il a une taille nulle, donc toute tentative de lecture ou d'écriture à travers le mappage sera la faute. Vous devez remplir le fichier avec suffisamment de zéros (ou quelque chose d'autre) pour couvrir le mappage, par exemple en utilisant ftruncate.

0

Vous obtiendrez SIGBUS si vous essayez d'écrire après la région cartographiée du fichier.

Les chances sont assez bonnes que votre fichier de magasin de sauvegarde accounts est tronqué/trop court. (Par exemple) si le fichier a l'espace pour 10 entrées struct et vous écrivez au 11, vous aurez SIGBUS

faire une fstat pour obtenir st_size et comparer par rapport au paramètre de longueur que vous donnez à mmap

Vous voudrez peut-être envisager d'utiliser ftruncate pour étendre le fichier avant de le faire mmap