C 返回“无此类文件或目录”的mmap

C 返回“无此类文件或目录”的mmap,c,mmap,C,Mmap,我试图将文件描述符映射到内存,但出现错误 日志缓冲区大小定义为500 printf("fcntl fd check: %d\n", fcntl(ss->fd_log, F_GETFD)); ss->log_mmap = mmap(NULL, LOG_BUFFER_SIZE, PROT_WRITE | PROT_WRITE, MAP_PRIVATE, ss->fd_log, 0); if (ss->data_mmap == NULL){ printf("mmap(

我试图将文件描述符映射到内存,但出现错误

日志缓冲区大小定义为500

printf("fcntl fd check: %d\n", fcntl(ss->fd_log, F_GETFD));
ss->log_mmap = mmap(NULL, LOG_BUFFER_SIZE, PROT_WRITE | PROT_WRITE, MAP_PRIVATE, ss->fd_log, 0);

if (ss->data_mmap == NULL){
    printf("mmap() error: %s (errno=%d)\n", strerror(errno), errno);
    exit(EXIT_FAILURE);
}
正如我所检查的,文件描述符是有效的:

fcntl fd check: 1
mmap() error for fd #6: No such file or directory (errno=2)
这是战略:

access("../ss_data/SunLoadRight", F_OK) = -1 ENOENT (No such file or directory)
open("../ss_data/log/SunLoadRight.log", O_RDWR|O_CREAT|O_APPEND|O_CLOEXEC, 0662) = 6
fcntl(6, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
write(1, "fcntl fd check: 1\n", 18fcntl fd check: 1
)     = 18
mmap(NULL, 500, PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x7f624c426000
write(1, "mmap() error for fd #6: No such "..., 60mmap() error for fd #6: No such file or directory (errno=2)
) = 60
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {SIG_DFL, [], SA_RESTORER, 0x7f624be704b0}, NULL, 8) = 0
open("gmon.out", O_WRONLY|O_CREAT|O_TRUNC|O_NOFOLLOW, 0666) = 7
write(7, "gmon\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20) = 20
writev(7, [{"\0", 1}, {"\320\33@\0\0\0\0\0\354\370@\0\0\0\0\0H7\0\0d\0\0\0seconds\0"..., 40}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 28304}], 3) = 28345
writev(7, [{"\1", 1}, {"\320*@\0\0\0\0\0$\35@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\300,@\0\0\0\0\0A\255@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\320,@\0\0\0\0\0\222\265@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\340,@\0\0\0\0\0n\265@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\360,@\0\0\0\0\0\341\316@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"0-@\0\0\0\0\0\367\342@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\240-@\0\0\0\0\0>\321@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"0/@\0\0\0\0\0\22\300@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"01@\0\0\0\0\0\37\275@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\2601@\0\0\0\0\0\232\310@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\320\257@\0\0\0\0\0\246\262@\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"0\260@\0\0\0\0\0-\256@\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\220\261@\0\0\0\0\0\22\300@\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\300\262@\0\0\0\0\0-\256@\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\200\265@\0\0\0\0\0\"\264@\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\240\265@\0\0\0\0\0\"\264@\0\0\0\0\0\1\0\0\0", 20}, ...], 62) = 651
close(7)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++
这对我来说都是全新的东西,所以我可能在某个地方犯了一些基本的错误。我猜是带有标志的东西?

您正在设置ss->log\u mmap,但正在检查ss->data\u mmap

从您的strace中,mmap返回了一个有效的指针。看起来没有发生任何不正确的事情,也没有出现任何失败。我怀疑你的mmap工作得很好。此外,Enoint不是mmap返回的有效错误代码,因此当mmap没有错误时,您可能正在检查errno

失败时,mmap返回MAP_FAILED,而不是NULL。它们没有相同的值


文件的私有只写映射似乎不是很有用。您不会写入文件,只会写入无法读取且其他进程无法看到的私有内存区域。您可能希望共享映射,以便写入可以进入文件。

分配给ss->log\u mmap,然后检查ss->data\u mmap是可疑的。还有保护写,保护写?还可以查看手册页上关于失败时mmap返回值的说明。第二个输出行与第二个printf不匹配。fd 6的数据来自哪里?