Tag: glibc

“C或gcc”就像“鸡肉还是鸡蛋”? :(

可能重复: gcc / g ++是如何引导的? 我想知道gcc是如何编译的,因为我们都知道它是用C语言编写的。 他们是否使用其他编译器来提供gcc? 如果是这样,我可以使用相同的编译来编译我的C程序吗?

是什么让glibc malloc可以比较来自不同“对象”的指针?

比较指针与关系运算符(例如< , <= , >=或> )仅在指针指向同一聚合对象(结构,数组或联合)时由C标准定义。 这在实践中意味着形状的比较 if (start_object <= my_pointer && my_pointer < end_object+1) { 可以变成 if (1) { 通过优化编译器。 尽管如此,在K&R的第8.7节“示例 – 存储分配器”中,作者进行了与上述类似的比较。 他们原谅这个说法 然而,仍有一个假设是,可以有意义地比较sbrk返回的不同块的指针。 标准不保证这一点,它只允许在数组中进行指针比较。 因此,这个版本的malloc只能在一般指针比较有意义的机器之间移植。 而且,看来glibc中使用的malloc的实现做了同样的事情! 更糟糕的是 – 我偶然发现这一点的原因是 – 对于学校作业,我应该实现一个基本的类似function,并且作业的指示要求我们使用K&R代码,但我们必须更换通过调用mmap调用sbrk ! 虽然比较来自不同sbrk调用的指针可能是未定义的,但它也只是略微可疑,因为你有某种心理直觉,返回的指针应该来自同一个内存区域。 根据我的理解,由不同的mmap调用返回的指针甚至不能保证彼此远程相似,并且在mmap调用之间合并/合并内存块应该是非常非法的(并且看起来glibc避免了这种情况,只采用合并由sbrk或mmap页面内部返回的内存,而不是它们之间的内存),但是赋值需要这样。 问题:有人可以发光 是否可以优化将来自不同调用的指针与sbrk进行比较 如果是这样, glibc做什么让他们逃脱它。

是否有glibc附带的C自动resize/动态数组实现?

在glibc或C的任何标准Linux库中是否有动态数组实现? 我希望能够添加到列表而不必担心它的大小。 我知道std :: vector存在于C ++中,但我需要C等价物。

由于标准C委员会没有标准化gets()的简单替换,它应该是什么?

gets函数首先在C99中弃用,最后在C11中删除。 然而,在C库中没有直接替代它。 fgets()不是替代品,因为它不会删除最后的’\n’ ,这可能在文件末尾不存在。 许多程序员也错了。 有一个单行删除换行符: buf[strcspn(buf, “\n”)] = ‘\0’; ,但这是非常重要的,往往需要解释。 它也可能是低效的。 这会适得其反。 许多初学者仍然使用gets()因为他们的老师很蹩脚或他们的教程已经过时了。 微软提出了gets_s()和许多相关的函数,但是它并没有默默地截断超长行,这种约束违规的行为并不是很简单。 BSD和GNU libc都有getline ,在POSIX中标准化,通过realloc分配或重新分配缓冲区… 教初学者关于这个烂摊子的最佳方法是什么?

C标准库线程中的函数是否安全?

我在哪里可以获得明确的答案,我的memcpy (使用Ubuntu附带的eglibc实现)是否是线程安全的? – 老实说,我真的没有在文档中找到明确的YES或NO。 顺便说一句,对于“线程安全”,我的意思是,只要同时复制字节的日期字节是安全的,同时使用memcpy是安全的。 至少在将只读数据复制到不重叠的区域时,这应该是可能的。 理想情况下,我希望在ARM编译器文档中看到本页底部的列表。

glibc检测到错误

任何人都可以帮我理解这个错误信息吗? *** glibc detected *** ./kprank_new3_norm: munmap_chunk(): invalid pointer: 0x00000000096912d0 *** ======= Backtrace: ========= /lib64/libc.so.6(cfree+0x1b6)[0x3df6e75a36] ./kprank_new3_norm[0x409277] ./kprank_new3_norm[0x4092a9] ./kprank_new3_norm[0x4092ea] ./kprank_new3_norm[0x40941f] ./kprank_new3_norm[0x40943b] ./kprank_new3_norm[0x40945f] ./kprank_new3_norm[0x409628] ./kprank_new3_norm[0x4096a7] ./kprank_new3_norm[0x40968d] ./kprank_new3_norm[0x409750] ./kprank_new3_norm[0x4097a5] ./kprank_new3_norm[0x404846] /lib64/libc.so.6(__libc_start_main+0xf4)[0x3df6e1d974] ./kprank_new3_norm(__gxx_personality_v0+0x99)[0x4017f9] ======= Memory map: ======== 00400000-00412000 r-xp 00000000 08:21 25795429 /home/rkrish/abhik/kprank/kprank_new3_norm 00611000-00612000 rw-p 00011000 08:21 25795429 /home/rkrish/abhik/kprank/kprank_new3_norm 09691000-096d3000 rw-p 09691000 00:00 0 [heap] 3df6a00000-3df6a1c000 r-xp 00000000 08:02 […]

为什么`putchar()`,`fputc()`和`putc()`的参数类型不是`char`?

有谁知道为什么putchar() , fputc()和putc()参数类型不是char ,但putwchar() , fputwc()和putwc()参数类型是wchar_t ? 另见这个和这个 。

gdb反向调试avx2

所以我有一个新的花式cpu支持avx2指令集。 这很好,但打破了gdb反向调试。 在没有优化的情况下进行编译时,代码仍然使用共享库,例如调用memset()然后调用memset的avx2优化版本。 这很好,但gdb记录不支持avx2。 进程记录不支持地址0x7ffff690dd80处的指令0xc5。 0xc5是这里的vex前缀。 反向调试适用于不支持avx2的cpu。 如何让libc等不使用avx2优化版本的库调用,以便我可以使用gdb记录,向后退步等? 我试过了 LD_BIND_NOW=1 LD_HWCAP_MASK=0 compiling with -static 如果没有在旧机器上调试,我就没有想法了。

printf减慢了我的程序

我有一个小的C程序来计算哈希值(哈希表)。 我希望代码看起来很干净,但有一些与之无关的东西让我烦恼。 我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr / bin / time为基准)。 但是,当我在for循环中使用printf()时,程序会减慢到大约5秒钟。 为什么是这样? 如何让它更快? mmapp()ing stdout也许? stdlibc是如何设计的,以及如何改进? 内核怎么能更好地支持它? 如何修改本地“文件”(套接字,管道等)的吞吐量真的很快? 我期待着有趣而详细的回复。 谢谢。 PS:这是一个编译器构造工具集,所以不要害羞进入细节。 虽然这与问题本身无关,但我只想指出细节让我感兴趣。 附录 我正在寻找更多解决方案和解释的程序方法。 确实,管道工作起了作用,但我无法控制“用户”的作用。 当然,我现在正在进行测试,“普通用户”不会这样做。 但是,这并没有改变一个简单的printf()减慢进程的事实,这是我试图找到最佳编程解决方案的问题。 附录 – 令人惊讶的结果 参考时间用于TTY内的普通printf()调用,大约需要4分20秒。 在/ dev / pts(例如Konsole)下进行测试可将输出速度提高到约5秒。 在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒。 setbuffer()在使用它时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒)。 令人惊讶的是 ,如果我在TTY1上开始测试然后切换到另一个TTY ,它确实与PTS上的相同:大约5秒。 结论 :内核做了一些与可访问性和用户友好性有关的事情。 呵呵! 通常情况下,无论您在活动时盯着TTY,还是切换到另一个TTY,它都应该同样慢。 课程 :运行输出密集型程序时,切换到另一个TTY!

libc随机数生成器有缺陷吗?

考虑一种算法来测试在特定次数的尝试之后从一组N个唯一数字中挑选某个数字的概率(例如,N = 2,轮盘中的概率是什么(没有0),它需要X尝试黑赢?) 对此的正确分布是pow(1-1 / N,X-1)*(1 / N)。 但是,当我使用下面的代码测试时,X = 31处始终存在深沟,独立于N,并且独立于种子。 这是一个内在的缺陷,由于PRNG的实施细节在使用中无法防止,这是一个真正的错误,还是我忽略了一些明显的东西? // C #include #include #include int array[101]; void main(){ int nsamples=10000000; double breakVal,diffVal; int i,cnt; // seed, but doesn’t change anything struct tms time; srandom(times(&time)); // sample for(i=0;i<nsamples;i++){ cnt=1; do{ if((random()%36)==0) // break if 0 is chosen break; cnt++; }while(cnt<100); array[cnt]++; } // […]