小编6EQ*_*UJ5的帖子

在没有先调用munmap()的情况下关闭文件描述符后mmap()'ed指针的行为是什么?

请考虑以下代码片段:

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>

int fd = open( "/path/to/existing/file/or/device", O_RDONLY);
int numberOfWords = 4096; // chosen to be smaller than file size
int* data = mmap( NULL, nomberOfWords * sizeof(int), PROT_READ, MAP_SHARED, fd, 0); 
if (data != MAP_FAILED) {

   printf( "%d\n", data[0]);

   // oops, forgot to munmap

   close(fd);

   printf( "%d\n", data[0]);        // <-- why doesn't this segfault

}
Run Code Online (Sandbox Code Playgroud)

背景

我正在使用ioctl()用于设置DMA 的自定义内核驱动程序,并最终需要用户空间mmap()来访问特定缓冲区.

在开发单元测试时,我偶然发现在没有munmap先调用的情况下关闭文件描述符后,仍然可以使用mmap指针访问用户空间中的缓冲区内存.想到驱动程序中有一些错误我编写了一个类似于此处所示的小程序,用一个"普通"文件来运行mmap().

我期待看到的是关闭后读取的段错误,我的想法是,munmap()当打开文件描述符的使用被关闭时,内核将自动与文件描述符关联的页面,类似于进程时的情况被终止.

相反,我能够继续使用指针.这有点令人惊讶,因为我已经使用mmap()了几年,我一定很聪明(更可能是幸运的)足以避免可能暴露这种情况的错误.mmap …

c linux posix kernel

5
推荐指数
1
解决办法
3300
查看次数

ldapadd:无效格式(第1行)条目:""在包括CentOS6的系统上添加模式时

我正在尝试将架构pwm.schema添加到ldap并获得以下错误.

命令:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/pwm.schema
Run Code Online (Sandbox Code Playgroud)

输出:

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldapadd: invalid format (line 1) entry: ""
Run Code Online (Sandbox Code Playgroud)

文件内容如下:

attributetype ( 1.3.6.1.4.1.591242.2.2010.04.16.1 NAME 'pwmEventLog'
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
attributetype ( 1.3.6.1.4.1.591242.2.2010.04.16.2 NAME 'pwmResponseSet'
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
attributetype ( 1.3.6.1.4.1.591242.2.2010.04.16.3 NAME 'pwmLastPwdUpdate'
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
attributetype ( 1.3.6.1.4.1.591242.2.2010.04.16.4 NAME 'pwmGUID'
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

objectclass ( 1.3.6.1.4.1.591242.1.2010.04.16.1 NAME 'pwmUser'
        AUXILIARY
        MAY ( dstPwdUpdate $ pwmEventLog $ pwmResponseSet $ pwmGUID
        ))
Run Code Online (Sandbox Code Playgroud)

ldap

2
推荐指数
1
解决办法
6421
查看次数

如何运行Valgrind来查找我的嵌入式MIPSEL-linux盒子上的内存泄漏?

如何在嵌入式Linux机器上运行valgrind来查找主软件中的内存泄漏?

rcS脚本中,我运行如下:

./main_app
Run Code Online (Sandbox Code Playgroud)

如何将./main_app程序与valgrind联系起来?main_app进程永远不会终止.

我想不断将数据记录到文件中.此外,我想访问日志文件而不终止该main_app过程.我可以做telnet并可以访问日志文件.但问题是,除非处理程序关闭,我怎么能打开文件,即我不太明白哪个valgrind参数控制如何将内存泄漏记录到文件中.请帮忙!

valgrind mips embedded-linux

0
推荐指数
1
解决办法
3557
查看次数

标签 统计

c ×1

embedded-linux ×1

kernel ×1

ldap ×1

linux ×1

mips ×1

posix ×1

valgrind ×1