可以调用printf()块吗?

时间:2011-12-14 16:24:57

标签: ssh terminal stdout

printf()(或一般写入stdout)如何处理流量控制和缓冲? printf()是否保证在合理的时间内返回,还是会阻塞,直到实际上能够向stdout写入内容?

我正在考虑慢速SSH连接或类似的事情。这真的可以减慢printf()的一些程序吗?会不会立即发生,或者只是在某个缓冲区被填满之后(stdout的某个内部缓冲区,甚至可能是TCP发送缓冲区)?除了可能增加延迟和降低输出速度之外,使用SSH是否会产生一些其他差异?

如果是这样,那怎么被规避?线程是解决该问题的常用方法,还是有一些更简单的方法来设置标志或进行调用以将stdout切换为“非阻塞模式”?或者我有一些关于Unix I / O工作完全错误的基本事实,这个问题没有任何意义吗? :)

我主要是出于兴趣而问,但是在使用C和shell进行实验时,这个问题最近出现了两次,我想知道应该在哪里以及如何解决这个问题:

  • 在开发一个可能会向终端输出大量输出以进行调试或信息用途的应用程序时,会降低终端速度是否会导致性能问题?我(作为程序员)是否应该为大型列表避免使用(对于y中的每个x:print y)构造?

  • 或者这是一个应该由应用程序用户而不是开发人员处理的问题,通过将输出重定向到文件等?如果是这样,是否有任何有用的shell习惯用法将程序输出与实际执行分开,例如mytool | cat(我不确定这个特定的例子是否真的会改变任何东西,但是cat可以用更复杂的东西代替)。

1 个答案:

答案 0 :(得分:3)

是的,拨打printf()可能会阻止。一个例子是stdout连接到另一端带有慢速阅读器的管道。

这是一个问题还是如何最好地缓解它实际上取决于应用程序的性质,为什么它首先是一个问题。