2013-03-02 75 views
2

例如puts()调用系统调用write()。 这是否意味着每次我们拨打puts()时它都会调用write(),或者在调用write()之前将累计值累加到某个缓冲区中?每次调用stdio函数都会导致系统调用吗?

+0

如果你在屏幕上看到它,那么它不会被缓冲。 – 2013-03-02 03:48:56

+1

不,'puts()并不总是调用系统调用。 Unix缓存输出的C stdio库,通常在(a)它进入终端时写出缓冲区(系统调用),和(b)写入新行(作为puts(3))。如果stdout不是终端,它只是被缓存直到缓冲区已满。 – vonbrand 2013-03-02 03:57:02

回答

2

你是对的 - 通常C FILE*流确实有存储数据的缓冲区。只有在缓冲区已满或流被关闭或调用了fflush时,它们才会进行Unix I/O系统调用。您可以使用C标准功能setvbuf来控制流的缓冲。

3

stdio函数确实利用缓冲。在puts()这个特殊情况下,它总是写一个完整的行到stdout,如果stdout连接到一个终端,那么它通常会被行缓冲,所以每次拨打puts()都会导致write()的调用。

然而,可能有stdout被完全缓冲 - 或者使用setvbuf()通过运行与stdout程序连接到一个管道或文件(只要这之前的任何其它操作上stdout完成),或更常见。在这种情况下,每次拨打puts()时都不一定会致电write()

相关问题