【发布时间】:2016-01-29 21:47:11
【问题描述】:
我有一个简单的程序:
int main(void) {
int fd;
const char *text = "This is a test";
fd = open("/tmp/msyncTest", (O_CREAT | O_TRUNC | O_RDWR), (S_IRWXU | S_IRWXG | S_IRWXO) );
if ( fd < 0 ) {
perror("open() error");
return fd;
}
/* mmap the file. */
void *address;
off_t my_offset = 0;
address = mmap(NULL, 4096, 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. */
strcpy( (char *)address, text);
/* use msync to write changes to disk. */
if ( msync( address, 4096 , MS_SYNC ) < 0 ) {
perror("msync failed with error:");
return -1;
}
else {
printf("%s","msync completed successfully.");
}
close(fd);
unlink("/tmp/msyncTest");
}
我的代码有什么问题吗?我做了一些简单的测试,似乎问题来自strcpy。但是按照定义,我觉得没有问题。
【问题讨论】:
-
你还没有展示如何检查
fd;如何设置len和my_offset;你如何检查mmap()电话。我们可以猜测与这些相关的某些东西导致代码失败。 -
@JonathanLeffler 好的,我会发布所有代码。
-
我们只需要查看一个 MCVE (How to create a Minimal, Complete, and Verifiable Example?) — 可能还有 10 行左右。
-
如果文件是新创建的(正如
O_CREAT暗示的那样),它将是零大小的。访问与基础文件(如果有)不对应的mmap()ed 区域的一部分会导致 sigbus。解决方法:ftruncate()mmap()之前的文件。 -
@EOF:您应该将其作为答案,以便 OP 可以接受。我点击这个问题来回答它,因为它没有答案,结果发现它已经有了答案,但是作为评论而不是答案提交。 :-p