2015-11-17 4 views
0

Я просто изучаю использование msync, однако я столкнулся с проблемой segmentation fault. Когда я меняю MAPSTEP на небольшое число, ошибка исчезла. Что случилось с этим кодом?ошибка сегментации во время вызова MSN

#define MAPSTEP 1 * 4096 
main(void) { 
    size_t bytesWritten =0; 
    int fd; 
    const char text[MAPSTEP]; 
    memset(text, '-', sizeof(char) * MAPSTEP); 

    fd = open("/tmp/mmsyncTest", (O_CREAT | O_TRUNC | O_RDWR), 
      (S_IRWXU | S_IRWXG | S_IRWXO)); 
    if (fd < 0) { 
    perror("open() error"); 
    return fd; 
    } 

    off_t lastoffset = lseek(fd, MAPSTEP, SEEK_SET); 
    bytesWritten = write(fd, " ", 1); 
    if (bytesWritten != 1) { 
    perror("write error. "); 
    return -1; 
    } 

    /* mmap the file. */ 
    void *address; 
    int len; 
    off_t my_offset = 0; 
    len = MAPSTEP; /* Map page */ 
    address = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, my_offset); 

    if (address == MAP_FAILED) { 
    perror("mmap error. "); 
    return -1; 
    } 

    /* Move some data into the file using memory map. */ 
    (void) strcpy((char*) address, text); 
    /* use msync to write changes to disk. */ 
    if (msync(address, MAPSTEP , MS_SYNC) < 0) { 
    perror("msync failed with error:"); 
    return -1; 
    } 
    else (void) printf("%s","msync completed successfully.\n"); 

    close(fd); 
    unlink("/tmp/msyncTest"); 
} 

ответ

0

Одно наблюдение в функции unlink ("/ tmp/msyncTest"); is, имя файла не совпадает с именем, которое вы открыли ранее. Оно также может создать ошибку сегментации.