我试图找出如何在Mac上重新映射内存映射文件(当我想扩展可用空间时).
我在Linux世界中看到了我们的朋友,mremap但我在Mac上的标题中找不到这样的功能./Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h有以下内容:
mmapmprotectmsyncmunlockmunmapmremapman mremap 证实了我的恐惧.
我目前不得不munmap,mmmap如果我想调整映射文件的大小,这涉及使所有加载的页面无效.肯定有更好的办法.一定?
我正在尝试编写适用于Mac OS X和Linux的代码.如果我不得不这样做,我可以满足于在每种情况下使用最佳功能的宏,但我宁愿正确地做到这一点.
我正在使用标准mktime函数将a struct tm转换为纪元时间值.这些tm字段在本地填充,我需要将纪元时间作为GMT.tm有一个gmtoff字段允许您为此目的设置本地GMT偏移量(以秒为单位).
但我无法弄清楚如何获取这些信息.当然必须有某个标准函数返回偏移量?怎么localtime做?
如果malloc/free是作为libc中的库例程实现的,那么它是在sbrk系统调用或mmap系统调用之上实现的,还是其他什么?
一般来说,sys/syscall.h中声明的函数是否包含目标机器中的所有系统调用?
标准Linux库中是否有一个函数(或接口; ioctl,netlink等),它将直接从内核返回当前的挂载而不解析/ proc? strace在mount命令中,它看起来像是解析/ proc中的文件
非系统调用的包装器,但类似于snprintf(),dprintf()
尝试运行多个可执行文件时,我收到以下错误:
/lib/libc.so.6: version `GLIBC_2.7' not found (required by .tools/bridge/bridge)
Run Code Online (Sandbox Code Playgroud)
我最近从CentOS 5.3升级到5.7(我需要在CentOS 5上运行这些工具,所以我不能升级到6).我重新编译了整个代码,但仍然出现此错误.
有没有人遇到过这种类型的错误?
谢谢,克劳迪
由于与此问题无关的一些模糊原因,我需要使用MAP_FIXED来获取靠近libc的文本部分存储在内存中的页面.
在阅读mmap(2)之前(我本来应该做的),如果我用MAP_FIXED调用mmap并且基地址与已经映射的区域重叠,那么我期望得到一个错误.
然而事实并非如此.例如,这是某些进程的/ proc/maps的一部分
7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Run Code Online (Sandbox Code Playgroud)
其中,在进行以下mmap调用之后......
mmap(0x7ffff731b000,
getpagesize(),
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
0,
0);
Run Code Online (Sandbox Code Playgroud)
... 变成:
7ffff7299000-7ffff731b000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
7ffff731b000-7ffff731c000 rwxp 00000000 00:00 0
7ffff731c000-7ffff744c000 r-xp 00083000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
Run Code Online (Sandbox Code Playgroud)
这意味着我用自己的页面覆盖了专用于libc的部分虚拟地址空间.显然不是我想要的......
在mmap(2)手册的MAP_FIXED部分,它清楚地说明:
如果addr和len指定的内存区域与任何现有映射的页面重叠,则将丢弃现有映射的重叠部分.
这解释了我所看到的,但我有几个问题:
在Android上使用OSGi平台时我得到了这个errormsg:

致命信号7(SIGBUS)位于0x595302e0(代码= 2)
我认为我的应用程序在内存中需要那么多空间或者需要很多计算能力.它只是OSGi平台,有20个捆绑包.
我的应用程序总是在那之后重新启动.
有任何想法吗 ?
尝试\i create_db.sqlpsql时会抛出错误:
psql:create_db.sql:123: ERROR: could not load library
"/usr/lib64/pgsql/plpgsql.so": /lib64/libc.so.6: version
`GLIBC_2.14' not found (required by /usr/lib64/pgsql/plpgsql.so)
Run Code Online (Sandbox Code Playgroud)
create_db.sql的第123行是文件的最后一行,位于函数定义的末尾:
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
东西的版本:
$ psql --version
psql (PostgreSQL) 9.2.7
$ /lib64/libc.so.6 --version
GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by …Run Code Online (Sandbox Code Playgroud) 我们来看看这个Hello World程序
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello, World!");
const char* sFile = "/dev/stdout"; // or /proc/self/fd/0
const char* sMode = "w";
FILE * output = fopen(sFile, sMode);
//fflush(stdout) /* forces `correct` order */
putc('!', output); // Use output or stdout from stdio.h
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用output文件描述符编译时,输出为:
!Hello, World!
Run Code Online (Sandbox Code Playgroud)
使用输出stdout提供的文件描述符编译时stdio.h是按预期方式:
Hello, World!!
Run Code Online (Sandbox Code Playgroud)
我想,当putc用后者调用时,它会直接打印到stdout,当使用文件描述符时/dev/stdout,它将打开一个管道并打印到其中.我不确定.
这种行为更有趣,因为它不会覆盖'Hello'的第一个字符,而是将自己推入已经推送的字符串前面的行缓冲区的第一个位置.
从逻辑的角度来看,这是非常意外的.
谁能解释一下究竟发生了什么?
我正在使用
cc …
libc ×10
c ×6
linux ×5
glibc ×2
mmap ×2
amazon-ec2 ×1
android ×1
apache-felix ×1
async-safe ×1
centos ×1
datetime ×1
list ×1
macos ×1
mount ×1
osgi ×1
postgresql ×1
psql ×1
system-calls ×1
timezone ×1