问题标签 [libc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
350 浏览

c++ - 静态链接新的 libc 符号以与较低的 libc 版本一起使用

我有一个使用 eventfd 和 timerfd 内核系统调用的应用程序。为此,您需要一个现代内核和一个支持它们的 libc,至少 2.8。

我目前的情况是,我有一个具有正确内核的系统,但 2.7.11 libc 版本显然不支持新系统调用所需的功能。
但是,由于这 2 个接口(timerfd、eventfd)可能只是来自 libc 的系统调用调用,我想知道是否可以将所需的符号与现代 libc 静态链接,然后使用适当的内核在 2.7.11 libc 上运行应用程序.

正如我所看到的,静态链接的函数将只执行系统调用而不使用 libc,这将使它们安全,但我可能会忽略其他问题。

任何人都知道这听起来是否可行,我如何才能静态链接这些功能?

0 投票
17 回答
1060528 浏览

c - C逐行读取文件

我编写了这个函数来从文件中读取一行:

该函数正确读取文件,并且使用 printf 我看到 constLine 字符串也被正确读取。

但是,如果我使用该功能,例如:

printf 输出乱码。为什么?

0 投票
1 回答
337 浏览

c++ - 关于 libc_write() 的问题

我试图确定 libc_write 究竟做了什么。我正在用 c++ 设计的处理器模拟器上执行二进制文件,并且正在运行的程序已跳转到函数调用 libc_write()。现在,有 2 种不同类型的写入函数 - write() 将一个大缓冲区写入流,可能由许多缓冲区组成,这些缓冲区从其他缓冲区连续复制到内存中 - 和 writev() 将一组指针指向一个或多个缓冲区以及每个缓冲区的大小,并将它们全部写入单个流。libc_write 是做什么的?写,Writev,两者都没有?

0 投票
4 回答
3933 浏览

c - 达尔文真的没有mremap吗?

我正在尝试找出如何在 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 的代码。如果必须,我可以选择一个宏来在每种情况下使用最好的功能,但我宁愿正确地做到这一点。

0 投票
2 回答
30438 浏览

c - C 中 ptrdiff_t 定义在哪里?

ptrdiff_tC中定义在哪里?

0 投票
9 回答
130273 浏览

c - 比使用 memset 更快的零内存方法?

我了解到这memset(ptr, 0, nbytes)真的很快,但是有没有更快的方法(至少在 x86 上)?

我假设 memset 使用mov,但是在将内存归零时,大多数编译器都使用xor它,因为它更快,对吗?编辑 1:错误,正如 GregS 指出的那样,仅适用于寄存器。我在想什么?

我还问了一个比我更了解汇编程序的人来看看 stdlib,他告诉我在 x86 上 memset 没有充分利用 32 位宽的寄存器。但是当时我很累,所以我不太确定我是否理解正确。

edit2:我重新审视了这个问题并做了一些测试。这是我测试的:

结果:

zero_1 是最慢的,但 -O3 除外。zero_sizet 是最快的,在 -O1、-O2 和 -O3 上的性能大致相同。memset 总是比 zero_sizet 慢。(-O3 慢两倍)。有趣的一件事是,在 -O3 zero_1 与 zero_sizet 一样快。然而,反汇编函数的指令数量大约是其四倍(我认为是由循环展开引起的)。此外,我尝试进一步优化 zero_sizet,但编译器总是超过我,但这并不奇怪。

现在 memset 获胜,以前的结果被 CPU 缓存扭曲了。(所有测试均在 Linux 上运行)需要进一步测试。接下来我会尝试汇编程序:)

edit3:修复了测试代码中的bug,测试结果不受影响

编辑 4:在查看反汇编的 VS2010 C 运行时时,我注意到它memset的 SSE 优化例程为零。这将很难被击败。

0 投票
2 回答
17232 浏览

c - 如何在 Linux 上重新实现(或包装)系统调用函数?

假设我想完全接管 open() 系统调用,也许是为了包装实际的系统调用并执行一些日志记录。一种方法是使用 LD_PRELOAD加载接管 open() 入口点的(用户制作的)共享对象库。

open()然后,用户创建的 open() 例程通过dlsym()ing 和调用glibc 函数来获得指向 glibc 函数的指针。

然而,上面提出的解决方案是动态解决方案。假设我想open()静态链接我自己的包装器。我该怎么做?open()我猜机制是一样的,但我也猜想 user-defined和 libc之间会有符号冲突open()

请分享任何其他技术以实现相同的目标。

0 投票
2 回答
306 浏览

c - POSIX lfind()/lsearch() 是否比手动循环执行得更好?

是否lfind/lsearch执行比检查每个项目直到匹配的典型循环解决方案更好?这些功能存在有什么特殊的调味料/原因吗?

0 投票
2 回答
6181 浏览

c - 为什么 strtof 和 strtod 的 endptr 参数是指向非 const char 指针的指针?

标准 C 库函数strtofstrtod具有以下签名:

它们每个都将输入字符串 , 分解str为三个部分:

  1. 一个初始的、可能为空的空白序列
  2. 表示浮点值的字符“主题序列”
  3. 无法识别(并且不影响转换)的字符“尾随序列”。

如果endptr不是NULL,则*endptr设置为指向紧随作为转换一部分的最后一个字符的字符的指针(换句话说,尾随序列的开始)。

我想知道:为什么 是endptr指向const char指针的指针?不是*endptr指向const char字符串(输入字符串str)的指针吗?

0 投票
2 回答
6187 浏览

select - 确定准备接受 recv() 的字节数

我可以使用 select() 来确定对 recv() 的调用是否会阻塞,但是一旦我确定它们是要读取的字节,它们就是一种在我实际调用 recv() 之前查询当前可用字节数的方法)?