不带缓冲的io,怎么在linux中用不带缓存的文件io操作函数编程

1,怎么在linux中用不带缓存的文件io操作函数编程直接使用系统调用的read和write方法读写就是不带缓存的 。
2 , 带缓冲IO和不带缓冲IO的区别与联系首先要明白不带缓冲的概念:1、所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用 , 不是函数库的调用 。系统内核对磁盘的读写都会提供一个块缓冲,当用write函数对其写数据时,直接调用系统调用 , 将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘 。因此所谓的不带缓冲的I/O是指进程不提供缓冲功能 。每调用一次write或read函数,直接系统调用 。2、而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘 。因此,带缓冲的I/O在往磁盘写入相同的数据量时 , 会比不带缓冲的I/O调用系统调用的次数要少 。以c#语言举例子(将abcde写入一个my.txt中) 非i/o缓冲模式: filestream fw=new filestream("d:/my.txt",filemode.create); byte[]chars={97,98,99,100,101}; fw.write(chars); fw.close(); i/o缓冲模式: streamwriter sw=new streamwriter("d:/my.txt"); byte[]chars={97,98,99,100,101}; sw.write(chars); sw.flush(); sw.close(); 比较上面两个程序(结果一样),有什么不同?(多了sw.flush();) 这是因为缓冲i/o是将写入的每个字符按字节读?。?然后写入内存,不是写入文件,所以在写完后要通知系统强制将内存中内容写入文件(一次性,减少与磁盘之间来往读写) , 非i/o直接写入文件,开销大、时间长(这儿时间短,看不出) 。如果文件大,就会出现硬盘狂读,听到“嘶嘶”声音 。用过迅雷吗?那么就可以思考一下问什么迅雷有一个“设置缓冲”为2048kb的选项了,明白不?
3,带缓存与不带缓存函数的区别以 ssize_t write(int filedes, const void *buff, size_t nbytes)和size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp)来讲讲自己对unix系统下带缓存的I/O和不带缓存的I/O的区别 。首先要清楚一个概念,所谓的代缓存并不是指上面两个函数的buff参数,而是指unix系统在内核中所设的缓冲存储器 。当将数据写到文件上时,内核先将该数据写到缓存,如果该缓存未满 , 则并不将其排入输出队列 , 直到缓存写满或者内核再次需要重新使用此缓存时才将其排入输入队列,待其到达对首,在进行实际的I/O操作,也就是此时才把数据真正写到磁盘,这种技术叫延迟写 。现在假设内核所设的缓存是100个字节,如果你使用write,且buff的size为10,当你要把9个同样的buff写到文件时 , 你需要调用9次write,也就是9次系统调用,此时也并没有写到硬盘,如果想立即写到硬盘 , 调用fsync,可以进行实际的I/O操作 。标准I/O,也就是带缓存的I/O采用FILE* , FILE实际上包含了为管理流所需要的所有信息:实际I/O的文件描述符,指向流缓存的指针(标准I/O缓存,由malloc分配,又称为用户态进程空间的缓存,区别于内核所设的缓存),缓存长度 , 当前在缓存中的字节数,出错标志等,假设流缓存的长度为50字节 , 把以上的数据写到文件,则只需要2次系统调用(fwrite调用write系统调用),因为先把数据写到流缓存,当其满以后或者调用fflush时才填入内核缓存,所以进行了2次的系统调用write 。fflush将流所有未写的数据送入(刷新)到内核(内核缓冲区),fsync将所有内核缓冲区的数据写到文件(磁盘) 。不带缓存的read和write是相对于fread/fwrite等流函数来说明的 , 因为fread和fwrite是用户函数(3),所以他们会在用户层进行一次数据的缓存 , 而read/write是系统调用(2)所以他们在用户层是没有缓存的,所以称read和write是无缓存的IO,其实对于内核来说还是进行了缓存,不过用户层看不到罢了 。直接使用系统调用的read和write方法读写就是不带缓存的 。【不带缓冲的io,怎么在linux中用不带缓存的文件io操作函数编程】