网站开发的难点与重点,asp化妆品网站源码,国外域名注册做违法网站,案例学网页设计和网站建设都需要包含头文件#xff1a; unistd.h
read系统函数从打开的设备或文件中读取数据#xff0c;即将数据从外设上经过内核读到用户空间#xff1b;write系统函数相反#xff0c;向打开的设备或文件中写入数据#xff0c;即将数据从用户空间#xff08;I/O缓冲 unistd.h
read系统函数从打开的设备或文件中读取数据即将数据从外设上经过内核读到用户空间write系统函数相反向打开的设备或文件中写入数据即将数据从用户空间I/O缓冲送到内核然后刷到外设上。它们的函数原型如下
ssize_t read(int fd, void *buf, size_t count);
ssize_t为有符号整型size_t为无符号整型。fd为相应的文件描述符buf为用户给定的数据缓冲区该缓冲不是固定大小的由count值决定其大小用户给定字节数。如 read( fd , “hello” , 5 ); 此时的void *buf为char *类型。即count为请求读取的字节数即buf的大小。该函数的返回值为-1时表示读取数据失败返回值0时表示读出的字节数返回值等于0时表示已经读完了因此没有数据可读了。
ssize_t write(int fd, const void *buf, size_t count);
buf为需要输出的缓冲区由用户给定。cout为最大输出字节数buf的大小字节数。返回值为-1时表示写入失败0时表示写入的字节数。
以上两个缓冲区buf都是用户空间的地址但是与I/O缓冲区不一样后者是规定的前者是用户自己指定的。
思考利用read、write每次读或写1个Byte与利用gets和puts每次读或写1个Byte哪一种方式速度更快?
read和write函数为Linux系统函数其缓冲区由用户来维护即用户指定其大小从而每次要将用户空间的数据送到内核或从内核送到用户空间的数据大小是由用户来规定的count而gets和puts为C库函数其I/O缓冲区由库函数自己维护大小为8Byte因此平均上每传送8个Byte的数据量才会操作一次内核。综上以上两者在读写数据时显然read、write函数每次从用户空间读1Byte数据是就会操作一次内核系统调用开销更大速度会更慢。而puts和gets函数速度更快。 当然用户可以指定read和write的count参数来增大其缓冲区大小从而提高其读写速度使其比puts和gets更快对大文件来说效果更加明显。
下面举例说明read和write的用法 //将一个文件english.txt的内容读到另一个文件writefile.txt
[rootlocalhost work]# vim rdwr.c
[rootlocalhost work]# ls
english.txt rdwr.c
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include stdlib.h
#include stdio.h
#include unistd.hint main( )
{int fd;fd open(english.txt,O_RDONLY); //以只读方式打开printf(open readfiles fd%d\n,fd);if( fd -1 ){perror( open english.txt );exit(1);}int fd1;char buff[1024] { 0 }; //定义一个缓冲区fd1 read( fd,buff,sizeof(buff) ); //将数据读出到缓冲区printf(read readfiles fd1%d\n,fd1);if( fd1 -1 ){perror( read english.txt );exit(1);}int fd2;fd2 open( writefile.txt ,O_WRONLY | O_CREAT | O_EXCL,0664); //创建一个写文件并以只写的方式打开如果文件创建的文件存在则结束printf(open writefiles fd2%d\n,fd2);if ( fd2 -1 ){perror( creat file );exit(1);}int ret;while( fd1 ){ret write( fd2,buff,fd1); //将读出的数据写进另一个新文件if( ret -1 ){perror( write file);exit(1);}fd1 read( fd,buff,1024); //再次读数据到缓冲区if( fd1 -1 ){perror( read english.txt );exit(1);}}int qw1;int qw2;qw1close(fd); //关闭文件if( ret -1 ){perror( close readfile);exit(1);}qw2close(fd2);if( ret -1 ){perror( close writefile);exit(1);}return 0;
} [rootlocalhost work]# gcc -pipe -pedantic -Wall -ggdb3 rdwr.c -o rdwr
[rootlocalhost work]# ./rdwr
open readfiles fd3
read readfiles fd11024
open writefiles fd24
[rootlocalhost work]# ls
english.txt rdwr rdwr.c writefile.txt
[rootlocalhost work]# ll writefile.txt
-rwxrwxrwx. 1 root root 109055 Mar 19 11:39 writefile.txt
[rootlocalhost work]# ll english.txt
-rwxrwxrwx. 1 root root 109055 Mar 19 10:30 english.txt //两文件大小一样