首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux中阻止fprintf?

如何在Linux中阻止fprintf?
EN

Stack Overflow用户
提问于 2010-11-24 15:49:01
回答 4查看 1.9K关注 0票数 1

我有一个fprintf调用,当系统IO繁忙但仍然有大量CPU时,它被阻塞了大约10秒钟。我既没有setvbuf底层的流,也没有用O_DIRECT打开底层的fd。这意味着流同时具有stdio流和系统缓存。

我不知道fprintf调用怎么会被阻塞这么长时间。对于底层流的流缓冲区已满的最坏情况,我认为libc只是调用write(2)将缓冲区内容写入磁盘。但据我所知,未使用O_DIRECT打开的fd上的write(2)不会等待磁盘传输,即磁盘IO是异步的。因此,我能想到的唯一耗时的工作是内核为写入的数据分配缓存,但即使在系统内存不足的情况下,这似乎也不是10秒的工作。实际上,系统有数十MB的空闲内存和几GB的缓存内存。

有什么建议吗?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2010-11-24 15:59:11

你是否在多台机器上运行你的代码?如果是这样,行为是一样的吗?

如果没有,请检查系统日志中的磁盘访问错误,一旦我遇到类似的问题,原因是磁盘故障。

票数 0
EN

Stack Overflow用户

发布于 2010-11-24 16:54:56

写调用不是异步的,即系统调用必须从内核返回。当然,这个系统调用主要是将数据放在I/O队列中,这将在稍后进行真正的传输。然而,我猜这个I/O队列可能在相当长的一段时间内是不可访问的。

这与要写入的介质无关,只要它是块设备即可。我有一个程序写入流的JPEG图像到SD卡。由于硬盘上发生的操作,此程序将被卡住。

但是,如果这是写调用阻塞10秒的问题,您可以尝试终止您的程序。我不知道它会怎样或者是否会干扰你试图观察的行为

代码语言:javascript
复制
strace -T -e trace=write progname

如果您想要监视日志活动,您可以将日志写入重定向到管道或命名管道,放置一个从该管道读取并写入日志文件的进程,并对其执行strace操作。

票数 0
EN

Stack Overflow用户

发布于 2010-11-24 17:00:58

您说您没有在流上调用setvbuf(),但是流使用的是哪种缓冲?除非您使用的流是stderr (有时是stdout),否则默认情况下它将是块缓冲的,这意味着在缓冲区已满(通常为4096字节或更多)之前不会发生写入。根据您写入日志的频率,这可能会导致您感觉到10秒的延迟。

所以我会尝试一下:setvbuf(my_stream, NULL, _IONBF, 0);

编辑: ...Or,有可能我完全误解了“被阻止”这个词。不管怎样,还是要走了,以防万一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4264505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档