标签: libc

在达尔文真的没有mmap?

我试图找出如何在Mac上重新映射内存映射文件(当我想扩展可用空间时).

我在Linux世界中看到了我们的朋友,mremap但我在Mac上的标题中找不到这样的功能./Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h有以下内容:

  • mmap
  • mprotect
  • msync
  • munlock
  • munmap
  • 但不是 mremap

man mremap 证实了我的恐惧.

我目前不得不munmap,mmmap如果我想调整映射文件的大小,这涉及使所有加载的页面无效.肯定有更好的办法.一定?

我正在尝试编写适用于Mac OS X和Linux的代码.如果我不得不这样做,我可以满足于在每种情况下使用最佳功能的宏,但我宁愿正确地做到这一点.

c macos mmap libc memory-mapped-files

15
推荐指数
2
解决办法
3117
查看次数

获取C中的时区GMT偏移量

我正在使用标准mktime函数将a struct tm转换为纪元时间值.这些tm字段在本地填充,我需要将纪元时间作为GMT.tm有一个gmtoff字段允许您为此目的设置本地GMT偏移量(以秒为单位).

但我无法弄清楚如何获取这些信息.当然必须有某个标准函数返回偏移量?怎么localtime做?

c timezone datetime libc

15
推荐指数
4
解决办法
4万
查看次数

malloc/free是libc提供的系统调用还是库例程?

如果malloc/free是作为libc中的库例程实现的,那么它是在sbrk系统调用或mmap系统调用之上实现的,还是其他什么?

一般来说,sys/syscall.h中声明的函数是否包含目标机器中的所有系统调用?

c linux libc system-calls

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

Linux函数获取挂载点

标准Linux库中是否有一个函数(或接口; ioctl,netlink等),它将直接从内核返回当前的挂载而不解析/ proc? strace在mount命令中,它看起来像是解析/ proc中的文件

c linux mount libc

14
推荐指数
2
解决办法
2万
查看次数

13
推荐指数
2
解决办法
9262
查看次数

找不到GLIBC_2.7

尝试运行多个可执行文件时,我收到以下错误:

/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).我重新编译了整个代码,但仍然出现此错误.

有没有人遇到过这种类型的错误?

谢谢,克劳迪

glibc centos libc

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

使用mmap重叠页面(MAP_FIXED)

由于与此问题无关的一些模糊原因,我需要使用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指定的内存区域与任何现有映射的页面重叠,则将丢弃现有映射的重叠部分.

这解释了我所看到的,但我有几个问题:

  1. 有没有办法检测某些东西是否已映射到某个地址?没有访问/ proc/maps?
  2. 有没有办法在找到重叠页面的情况下强制mmap失败?

c linux mmap libc

13
推荐指数
2
解决办法
8192
查看次数

致命信号7(SIGBUS)在0x00000000(代码= 2)

在Android上使用OSGi平台时我得到了这个errormsg:

致命信号7(SIGBUS)位于0x595302e0(代码= 2)

致命信号7(SIGBUS)位于0x595302e0(代码= 2)

我认为我的应用程序在内存中需要那么多空间或者需要很多计算能力.它只是OSGi平台,有20个捆绑包.

我的应用程序总是在那之后重新启动.

有任何想法吗 ?

android osgi runtime-error libc apache-felix

12
推荐指数
1
解决办法
1万
查看次数

ec2服务器postgres错误"找不到版本`GLIBC_2.14'"

尝试\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)

postgresql glibc libc amazon-ec2 psql

12
推荐指数
1
解决办法
1518
查看次数

FILE*"/ dev/stdout"和stdout之间的区别

我们来看看这个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 …

c linux libc

12
推荐指数
1
解决办法
1714
查看次数