簡體   English   中英

在C中使用memset()時遇到總線錯誤?

[英]Getting a Bus Error when using memset() in C?

我正在制作一個使用共享內存和mmap在不同進程/線程之間進行通信的程序,但是在運行時我總是遇到總線錯誤。 我已經隔離了錯誤,並且似乎在memset()執行之后就發生了。 我是否設置了錯誤的內存映射? 無符號字符* create_bitmap(無符號長整數)

 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但是由於崩潰而丟失了。

換句話說,無論您身在何處:

printf("something");

更改為:

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

這將確保刷新緩沖區,因為如果崩潰時緩沖區不在緩沖區中,則很可能會丟失信息。 fsync()本身可能不是必需的,為了安全起見,我使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM