Mapped file on Cygwin continuing to cause SIGBUS even after a call to ftruncate that fills that page

Viewed 26

I'm trying to mmap a page-size-rounded file to an area larger than the file size and ftruncate it when one of the traling pages causes a SIGBUS so that the SIGBUS no longer happens.

This works great on Linux and MacOS, but on Cygwin I keep getting a SIGBUS even after a successful growing ftruncate.

#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
void perrorAndExit(char const *Ctx){ perror(Ctx); _exit(1); }
int main(){
    long pgsz = sysconf(_SC_PAGESIZE);
    int fd = open("TMPFILE", O_RDWR|O_CREAT,0640);
    if(0>fd) perrorAndExit("open");
    if(ftruncate(fd,pgsz*1)) perrorAndExit("truncate 1 pgsz");

    char *m;
    if(MAP_FAILED==(m = mmap(0,pgsz*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))) perrorAndExit("mmap");
    memset(m,'=',pgsz);
    strcpy(m,"hello, world\n");
    if(ftruncate(fd,pgsz*2)) perrorAndExit("truncate 2 pgsz");
    strcpy(m+pgsz,"what is up?\n"); //still SIGBUSes on Cygwin
}

Are there any workarounds for this other than starting with a larger file or creating a new mapping after the second truncate?

0 Answers
Related