Tag: printf

glibc的fprintf()线程安全实现吗?

fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入。 编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程。 查看该文件,一些写入混合在一起。 编辑2:我看到的问题似乎可能是由于lighttpd的“工作线程”实际上是单独的进程: http : //redmine.lighttpd.net/wiki/lighttpd/Docs : MultiProcessor 问题 通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点: mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步。 mod_status将有n个独立的计数器,每个进程一个。 mod_rrdtool将失败,因为它收到两次相同的时间戳。 mod_uploadprogress将不会显示正确的状态。

printf中的序列点

我在这里读到有一个序列点: 在与输入/输出转换格式说明符相关联的操作之后。 例如,在表达式printf(“foo %n %d”, &a, 42) ,在打印42之前评估%n之后存在序列点。 但是,当我运行此代码时 : int your_function(int a, int b) { return a – b; } int main(void) { int i = 10; printf(“%d – %d – %d\n”, i, your_function(++i, ++i), i); } 而不是我期望得到的: 12 – 0 – 12 这意味着没有为转换格式说明符创建序列点。 http://en.wikipedia.org是错误的,或者我只是误解了某些内容,或者在这种情况下gcc是否不合规(顺便提一下Visual Studio 2015会产生相同的意外结果)? 编辑: 我理解,对your_function的参数的计算顺序和分配给参数的顺序是未定义的。 我不是在问我为什么我的中期是0.我问为什么其他两个术语都是12。

这个缓冲区溢出的后果?

所以在这里我相信我在查看其他人的代码时发现了一个小的缓冲区溢出问题。 它立刻让我觉得不正确,而且有潜在危险,但不可否认,我无法解释这个“错误”的实际后果,如果有的话。 我写了一个测试应用程序来演示错误,但发现(令我沮丧的是)无论溢出如何,它似乎都能正常运行。 我想相信这只是偶然的,但是需要一些反馈来确定我的想法是否错误,或者是否真的存在问题,而这些问题并没有在我的测试应用中显示出来。 问题代码(我认为无论如何): char* buffer = new char[strlen(“This string is 27 char long” + 1)]; sprintf(buffer, “This string is 27 char long”); 现在,这对我来说很突出,我想把它标记为可能的缓冲区溢出是因为第一个strlen 。 由于指针运算, + 1的’不正确’位置将导致strlen返回26而不是27 (取“他的字符串长度为27 char”)。 我相信sprintf 27个字符打印到缓冲区并导致缓冲区溢出。 这是正确的评估吗? 我写了一个测试应用程序来为我正在查看的代码演示这个,并发现即使在调试器中字符串也会正确打印。 我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否可以影响邻近的内存区域,但仍然收到正确的输出。 我意识到我新分配的堆内存可能不相邻,这可以解释缺乏有用的溢出,但我真的想确认其他人的意见,如果这实际上是一个问题。 由于这是一个非常简单的“问题”,如果你能通过某种参考来支持你的答案,那就太好了。 虽然我重视并欢迎您的意见,但我不会接受“是的”作为最终答案。 提前谢谢你。 更新:许多有很多额外见解的好答案。 不幸的是,我无法接受所有这些。 感谢您分享您的知识并成为我的“第二意见”。 我很感激帮助。

sprintf函数的缓冲区溢出?

{ char buf[8]; sprintf(buf,”AAAA%3s”,”XXXXXXXX”); printf(“%s\n”,buf); } 会发生什么? 缓冲区有8个字符空间,只剩下3个空闲字符,但“XXXXXXXX”长度为8个字符。 我在Windows 7上使用Visual Studion 2008进行测试。结果,打印的程序:AAAXXXXXXX,发生了运行时错误。

实现定义类型的格式说明符,如time_t

我想让我的代码更加平台/独立于实现。 我不知道在编译代码时将在平台上实现什么time_t 。 我如何知道t的类型以确定要使用的格式说明符? … time_t t = time(NULL); printf(“%s”, t); …

printf格式字符串中“% – *。* s”的含义是什么

#define FMT “%-*.*se = %6ld, chars = %7ld, stat = %3u: %c %c %c %c\n” 该宏传递给printf函数。 %-*.*s是什么意思?

printf中“%.6d”是什么意思

%.6d含义是什么: printf(“%s.%.6d len:%d “, timestr, header->ts.tv_usec, header->len); 这是一个错字吗? 似乎%.6d与%6d相同。

fprintf是否在引擎盖下使用malloc()?

我想要一个最小的o-damn-malloc-just-failed处理程序,它将一些信息写入文件(可能只是标准错误)。 我更喜欢使用fprintf()而不是write(),但是如果fprintf()本身尝试使用malloc(),这将很难失败。 是否有一些保证,无论是在C标准中,还是只是在glibc中,fprintf都不会这样做?

何时使用printf / scanf vs cout / cin?

我正在使用MinGW的g ++测试我在网上发现的一些片段。 这是C ++编译器……为什么它正确地编译C ….为什么人们交织在一起C和C ++。 具体问题是:使用C和C ++并在g ++下编译是否可以。 如果答案是肯定的,那么我的生活很简单,因为我不需要修改代码。 奇怪的是……让一些C ++工作,特别是在将字符串传递给ifstream构造函数时,它需要一个C类型的字符串…… 我的猜测是,因为C ++有时依赖于C构造,所以可以将两种语言一起编写。 但是,作为一种风格问题,你应该选择cout / cin或printf / scanf 。

为什么这个c程序不打印第一个printf语句?

#include #include int main(){ while(1) { fprintf(stdout,”hello-out”); fprintf(stderr,”hello-err”); sleep(1); } return 0; } 在gcc中编译这个程序并执行它只打印hello-err而不是hello-out。为什么会这样?有人可以解释它背后的原因吗?