2016-10-09 20 views
1

Когда я впервые сделал этот проект в прошлом семестре, код работал нормально. Теперь я получаю ошибку шины, когда записывается mmapped-память для обмена между процессами, и я не уверен, почему она больше не работает.Ошибка шины при записи в 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; 
} 

ответ

2

документированной причиной для SIGBUS с ттар является

Покушения доступа к ару ortion буфера, который не соответствует файлу (например, за пределами файла, включая случай, когда другой процесс обрезал файл).

Я думаю, что файл accounts не существует, поэтому open с O_CREAT создал. Но он имеет нулевой размер, поэтому любая попытка чтения или записи через сопоставление будет неисправна. Вам нужно заполнить файл достаточным количеством нулей (или что-то еще), чтобы покрыть отображение, например, используя ftruncate.

0

вы получите SIGBUS если вы попытаетесь написать мимо отображенной области файла.

Шансы довольно хороши, что ваш файл хранилища accounts усечен/слишком короткий. (Например), если файл имеет пространство для 10 записей структуры и писать в 11-м, вы получите SIGBUS

Делает fstat, чтобы получить st_size и сравнить это с параметром длиной вы придающий mmap

Вы можете рассмотреть возможность использования ftruncate для расширения файла, прежде чем делать mmap