2

我正在制作一个使用共享内存和 mmap 在不同进程/线程之间进行通信的程序,但我在运行时不断收到总线错误。我已经隔离了错误,它似乎发生在 memset() 执行后。我是否错误地设置了内存映射?unsigned char *create_bitmap(unsigned long max)

 92 unsigned char *create_bitmap(unsigned long max)
 93 {
 94     int fd;
 95     unsigned long object_size = (max + 1) * sizeof(unsigned char);
 96     unsigned char *address;
 97
 98 //  fd = open("/dev/zero",O_RDWR);
 99     fd = shm_open("./morriluk_bitmap", O_RDWR|O_CREAT , S_IRUSR|S_IWUSR );
100     if(fd == -1){
101         perror("Unable to open morriluk_bitmap");
102         exit(EXIT_FAILURE);
103     }
104     printf("1\n");
105     if(ftruncate(fd, object_size) == -1){
106         perror("Unable to resize morriluk_bitmap");
107         exit(EXIT_FAILURE);
108     }
109     printf("2\n");
110
111     address = (unsigned char*)mmap(NULL, object_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
112     if (address == MAP_FAILED) {
113         perror("Unable to mmap morriluk_bitmap to any address");
114         exit(EXIT_FAILURE);
115     }
116     printf("3\n");
117
118     memset((void *)address, PRIME, object_size);
119     printf("4\n");
120
121     return address;
122 }

命令行输出:

creating bitmap
1
2
3
Bus error (core dumped)
4

1 回答 1

0

我会告诉你一件你应该做的事情,那就是刷新和同步输出缓冲区。很可能您实际上正在打印4,但由于崩溃而丢失了。

换句话说,无论你有什么:

printf("something");

将其更改为:

printf("something"); fflush(stdout); fsync(fileno(stdout));

这将确保缓冲区被刷新,因为如果当你崩溃时它们不是,你很可能会丢失信息。fsync()本身可能不是必需的,我使用它只是为了安全。

于 2015-08-07T01:55:48.290 回答