Tag: glibc

C:将数字转换为没有区域设置的字符串的可移植/安全(线程感知)方法是什么?

将数字转换为字符串的安全/可移植方式是什么(反之亦然)? 我在Linux上,我的设置区域设置是这样的,当我使用sprintf时,数字有一个“,”而不是“。” 作为分隔符。 有时我想要那样,有时候不是:) 我看到了一些暗示玩用户设置的解决方案。 显然,这是一个不该做的事情。 有人建议使用uselocale snprintf:简单的强制方式。 作为基数? 可以有人详细说明(看起来它在某些glibc(<2.12)上有问题)并且如果可能的话提供一些示例代码(例如宏SNPRINTF_POSIX)。 我试过自己,但我的C技能非常有限。 [编辑] 在写完我的问题后,我在Swisslinux.org上的[GO] Skywalker13找到了这段代码。 有什么想法吗? 内存使用情况怎么样? (我需要多次调用此函数) #define _GNU_SOURCE #include #include double my_atof (const char *nptr) { double res; locale_t new_locale; new_locale = newlocale (LC_NUMERIC_MASK, “C”, NULL); res = strtod_l (nptr, NULL, new_locale); freelocale (new_locale); return res; }

*** glibc检测到*** sendip:free():无效的下一个大小(正常):0x09da25e8 ***

可能重复: C ++错误:free():下一个大小无效(快): 这是一个C ++问题(虽然是’C ++被滥用’的问题)。 替代副本: 面临错误:glibc检测到免费无效下一个大小(快) 我正在使用Linux工具生成一些n / w流量,但是当我尝试发送大于某个长度的数据时,当工具为其提供时,会出现此错误。 我的整个项目都介于两者之间。 因为我还没有创建工具所以不确定错误发生在哪里……并且这个错误(甚至是gdb )没有给出关于问题所在位置的任何提示。如何检测错误点? 如果有问题,我会给出一些问题的快照。 请指导我该怎么办? 它对我来说看起来像一个网格。 udit@udit-Dabba ~ $ sendip -v -p ipv6 -f file.txt -6s ::1 -p esp -es 0x20 -eq 0x40 -ei abcd -eI zxc -p tcp -ts 21 -td 21 ::2 | more *** glibc detected *** sendip: free(): invalid next […]

数学库现在是否包含在glibc中?

当我尝试从终端编译这个简单的代码时: #include int main(void) { printf(“%f\n”,sqrt(10)); return 0; } 运用 gcc main.c 命令,它被编译,a.out给出正确的答案。 这意味着数学函数被添加到C标准库中,它自动链接。 但是如果在Eclipse IDE中编译相同的代码而不向属性添加任何库,则会给出未定义的引用错误。 这意味着数学函数不是C标准库的一部分。 真相是什么?

调试C运行时

我想详细了解使用GDB在main()之前和之后发生的事情。 仅仅用-g重新编译glibc并链接到那个就足够了吗?

`asprintf`是线程安全的吗?

GNU函数asprintf (打印到分配的字符串)线程安全吗? (IIC,基本上,这归结为malloc是否是线程安全的问题。) 考虑示例代码: #define _GNU_SOURCE #include #include “getValue.h” char * getValue(int key) { char * value; asprintf(&value, “%d”, key); // TODO: No error handling! // If memory allocation wasn’t possible, or some other error occurs, these functions will // return -1, and the contents of strp is undefined. return value; } 在这里,我不触及任何全局变量。 如果我的getValue在并发线程中被调用怎么办? 没有坏事会发生,他们会吗?

标准C库和系统调用如何协同工作?

我最近对编译器,标准库和内核的内部工作感兴趣。 当我在寻找标准C库的源代码时,我遇到了Glibc。 但它在Glibc的官方网站上所说的是: the library which defines the ”system calls” and other basic facilities such as open, malloc, printf, exit… 所以我猜Glibc实际上并没有提供标准C库的源代码,而是提供了对这些函数的系统调用,然后内核负责处理它们,对吗? 我想更多地了解这些事情。 例如,如何在C程序中执行sin , printf和strlen函数? 如果Glibc只提供系统调用,那些函数的实际源代码在哪里? 内核如何执行它们? 哪里可以找到执行这些function的内核部分的源代码?

getpwnam_r内存泄漏

我使用getpwnam_r来处理程序中的客户端连接。 可悲的是,它似乎分配了一个永远不会释放的缓冲区。 相关的valgrind输出: ==15774== 536 (104 direct, 432 indirect) bytes in 2 blocks are definitely lost in loss record 1 of 3 ==15774== at 0x4C24CFE: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so) ==15774== by 0x5143B5A: nss_parse_service_list (in /lib64/libc-2.10.1.so) ==15774== by 0x51442E6: __nss_database_lookup (in /lib64/libc-2.10.1.so) ==15774== by 0x57BE35F: ??? ==15774== by 0x57BF3F6: ??? ==15774== by 0x51014D2: getpwnam_r@@GLIBC_2.2.5 (in /lib64/libc-2.10.1.so) ==15774== […]

如何判断是否使用了glibc

我正在尝试为大型框架实现回溯function,该框架用于不同的平台和操作系统。 在其中一些中,它与glibc相关联,而在另一个中,使用了不同的东西(例如uclibc)。 backtrace()函数仅存在于前者中。 有没有办法判断glibc是否被使用? 任何#define? 我无法在glibc手册中找到答案。 我知道在编译期间我不能有链接时间信息,但我想包含文件必须有所不同。 至少必须在某处声明回溯。 我想检查它而不必强制将显式标志传递给编译器。

在执行期间访问.eh_frame数据

我正在尝试从其中访问正在运行的程序的.eh_frame部分的内容(具体来说,该程序是Linux内核2.6.34.8)。 .eh_frame包含用于exception处理的有用数据,我想在内核代码内部使用它。 该部分已由gcc编写( readelf -a vmlinux.o包含.eh_frame ),问题是从代码中读取它。 我很确定精灵格式的文档说在代码执行期间可以访问.eh_frame 。 我查看了glibc的源代码,以寻找.eh_frame用法,并在sysdeps/generic/sysdep.h找到了大多数CFA指令的宏,但没有找到加载.eh_frame数据的实际代码。 是否需要修改加载内核以从文件加载数据的过程,或者.eh_frame info / .eh_frame_hdr段指针存储在某处作为宏/汇编程序名称(因此可以将其提取到C变量中)?

为什么glibc“timezone”全球不同意DST的系统时间?

我遇到了一个奇怪的问题,我的系统时钟知道它是夏令时,但glibc似乎没有。 这是一个最新的Ubuntu安装,我检查了/ etc / localtime,它有正确的转换时间,用于上周切换到夏令时。 对我来说,目前正确的时区是太平洋夏令时(UTC-7)。 当我问我的系统我在哪个时区时,它正确告诉我: $ date +%z -0700 但是当我运行以下程序时: #include #include int main() { tzset(); printf(“%lu\n”, timezone); return 0; } 输出是错误的: 28800 对应于UTC-8或太平洋标准时间。 (不,TZ未在我的环境中设置) 我认为glibc和日期程序会从同一个来源获得他们的时区信息,但显然要么他们没有,要么我误解了glibc时区全局如何工作。 那么基本问题是: 为什么这两个输出不同 如何可靠地检测C程序的系统UTC偏移?