linux缓冲区类型

上次同学写了一个程序,在这里我给简化为下面的代码,

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("hello");
    while(1);
    return 0;
}

你会发现在linux系统下,执行这个程序的时候。程序并没有输出hello,难道是print语句没有执行吗?这也让我当时 感到疑惑了。猜测可能是缓冲区的原因。通过查资料我得到下面的事实。

标准IO提供了3种类型的缓冲区。全缓冲,行缓冲,无缓冲

只有等缓冲区填充满了才会进行IO系统调用。

1、全缓冲

在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

2、行缓冲

在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。典型代表是键盘输入数据。在linux系统中,终端就是一个行缓冲区。

3、不带缓冲

不带缓冲也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。对于标准输入输出设备,当且仅当不涉及交互作用设备时。标准输入输出设备才会是全缓冲区。

标准错误输出设备绝不会是全缓冲区

所以有了以上只是储备。对于这种情况就好理解了。上面的print语句是执行了的。只不过输出的语句还在缓冲区,由于没有遇上换行等操作,所以并没有进行系统的IO调用。

当我们把print语句改成下面的。或者加上fflush()将缓冲区更新则可以成功的输出hello ,这也进一步证明了上面的内容。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("hello\n");
    while(1);
    return 0;
}

:::c
#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("hello");
    fflush(stdout);
    while(1);
    return 0;
}

最后我们借此机会来测试一下。无缓冲区的情况。测试程序如下。我们发现这个程序输出的内容是 :::bash perror: Success 因为错误输出是没有缓冲区的,所以这个程序perror语句输出了。但是printf语句没有显示

#include<stdio.h>
#include<stdlib.h>
int main()
{
    perror("perror");
    printf("hello");
    while(1);
    return 0;
}

while(1);
return 0;

}