而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)
因此,带缓冲的I/O在往磁盘写入相同的数据量时,会比不带缓冲的I/O调用系统调用的次数要少。
linux read()函数:read函数从打开的设备或文件中读取数据。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
参数
count
是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。
#include "apue.h"
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFSIZE 3
int main(void)
{
int n;
n=0;
printf("n = %d",n);
int c=open("./kc.txt",O_RDONLY);
char buf[BUFFSIZE];
while((n=read(c,buf,BUFFSIZE))>0)
{
printf("n = %d ",n);
if(write(STDOUT_FILENO,buf,n)!=n)
err_sys("write error");
}
if(n<0)
err_sys("read error");
//exit(0);
return 0;
}
问题:read函数在读的文件的字节数小于buffsize时候为啥不出错,文件只有两个字节返回的为何是3个字节。为何read中有标准输入的时候,printf函数就无效了。
STDIN_FILENO与STDOUT_FILENO阻塞了printf,要这两个关闭之后才会显示printf的内容。
read函数会去读取BUFFERSIZE数量的文件内容,直到遇到文件结尾‘\0',会将该文件结尾读入。然后下次再读的时候就返回0。
ynnnnd
*** stack smashing detected ***: ./test terminated
n = 3 n = 3 n = 1 Aborted (core dumped)
如果buf的大小小于buffersize也会正常读写,只不过会碰到一个问题,最后会抛出段错误的信息,也就是栈溢出
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
Ctrl+D文件结束符