Tag: 标准库

限制C标准I / O以及为什么我们不能将C标准I / O与套接字一起使用

我最近正在阅读CSAPP。 在第10.9节中,它说标准I / O不应该与套接字一起使用,原因如下: (1)标准I / O的限制 限制1:输出function后的输入function。 如果没有对fflush,fseek,fsetpos或倒带的干预调用,输入function将无法跟随输出function。 fflush函数清空与流关联的缓冲区。 后三个函数使用Unix I / O lseek函数来重置当前文件位置。 限制2:输入function后的输出function。 除非输入函数遇到文件结尾,否则输出函数无法在没有对fseek,fsetpos或rewind进行干预调用的情况下跟随输入函数。 (2)在套接字上使用lseekfunction是违法的。 问题1 :如果违反限制会怎样? 我写了一个代码片段,它工作正常。 问题2 :绕过限制2,一种方法如下: File *fpin, *fpout; fpin = fdopen(sockfd, “r”); fpout = fdopen(sockfd, “w”); /* Some Work Here */ fclose(fpin); fclose(fpout); 在教科书中,它说, 在线程程序中关闭已经关闭的描述符是灾难的一个方法。 为什么?

用C ++实现C标准库

假设OS /内核是用C ++编写的,不会“做”任何纯C风格的东西,而是公开构建在完善的C ++标准库上的C标准库。 这可能吗? 如果没有,为什么? PS:我知道C库是“C ++的一部分”,但我们可以说它是基于基于C ++的实现。 小更新:似乎我已经激起了关于我的规则“允许”的讨论。 一般来说:C标准库实现应该尽可能使用C ++ / Right ™ 。 我主要考虑算法并在幕后对静态类对象进行操作。 我并没有真正排除任何语言function,而是试图将重点放在理智的C ++实现上。 关于setjmp示例,我认为没有理由为什么有效的C(将使用其他预先在C ++ C库部件中实现或根本不使用任何其他库函数)这将违反我的“规则”。 如果C ++库中没有对应物,为什么要讨论它的使用。

标准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的内核部分的源代码?

是否存在difftime占闰秒的实际系统?

C标准(ISO / IEC 9899)规定: 7.2x.2.2 difftime函数 概要 #include double difftime(time_t time1, time_t time0); 描述 difftime函数计算两个日历时间之间的差异: time1 – time0 。 返回 difftime函数以秒为单位返回以秒表示的差异。 如果结果占闰秒 ,则会使其模糊不清(我猜是故意的)。 在某些应用中,差异(从1970年到2015年7月比较时为26秒)很重要。 C标准库的大多数实现都不考虑闰秒,这是可测试的:以下(故意简洁)代码倾向于输出leap seconds accounted for from 2000/01/01 to 2015/01/01: 0 (或-473385600 )的leap seconds accounted for from 2000/01/01 to 2015/01/01: 0 -473385600如果mktime不起作用),那段时间内确实有3个闰秒。 #include #include struct tm t0,t1; // globals, thus initialized to zero […]

我在哪里可以看到与errno交互的函数列表?

在“The C Programming Language”一书中,它说: “当文件出现错误或文件结束时,库中的许多function都会设置状态指示器。这些指示器可以显式设置和测试。此外,整数表达式errno (在声明)可能包含一个错误号提供有关最新错误的进一步信息。“ 我在哪里可以看到这些function的列表?

C或C ++有标准的正则表达式库吗?

可以? 如果是,我在哪里可以得到它的文件……如果没有,那么哪个是最好的选择?

我应该考虑memmove()O(n)还是O(1)?

这可能是一个愚蠢的问题,但我想计算一个算法的复杂性,我不确定memmove()函数要考虑的复杂性。 你能帮忙/解释一下吗? void * memmove ( void * destination, const void * source, size_t num ); 复杂度O(num)或O(1)也是如此。 我想这是O(num),但我不确定我现在缺乏对引擎盖下发生的事情的理解。

我可以使用标准库在C中寻找超过2GB的位置吗?

我正在制作一个用C语言读取磁盘映像的程序。我正在尝试制作可移植的东西,所以我不想使用太多特定于操作系统的库。 我知道有很多磁盘映像是非常大的文件,但我不确定如何支持这些文件。 我已经阅读了fseek ,它似乎使用了一个long int ,它不能保证支持超过2 31 -1的值。 fsetpos似乎使用fpos_t支持更大的值,但无法指定绝对位置。 我也有关于使用fseek几个相对寻求,但我不确定这是否便携。 如何在C中支持可移植地支持大文件?

printf如何在内部工作?

我很好奇printf如何在Linux内部工作。 我不明白它如何将数据写入STDOUT 。 在对内部进行了一些搜索之后,我下载了glibc并查看了源代码: __printf (const char *format, …) { va_list arg; int done; va_start (arg, format); done = vfprintf (stdout, format, arg); va_end (arg); return done; } 找到这个之后,我深入研究了vfprintf函数 – 但该文件大约有2500行不熟悉的C代码。 我正在寻找10,000英尺的解释,如何printf与计算机的内存和输出一起工作,以在屏幕上显示字符。 如果我是汇编代码,我需要做些什么才能完成相同的任务? 它依赖于操作系统吗?

C标准库中的函数定义在哪里?

我对源代码不感兴趣,我想知道C编译器(GCC)实际上是如何找到这些函数的。 就像在预处理器看到我已经包含stdio.h ,它在哪里找到定义函数体的文件? 编辑 我可能也应该说我正在使用Ubuntu 12.04,但是如果有一般答案,那也会有用。