1. fsync() 函数同步内存中所有已修改的文件数据到储存设备
头文件
#include <unistd.h>
函数原型
int fsync(int fd);
说明
fsync函数同步内存中所有已修改的文件数据到储存设备。参数fd是该进程打开来的文件描述符。 函数成功执行时,返回0。失败返回-1,errno被设为以下的某个值
使用方法
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
const char* journal_filename = “journal.log”;
void write_journal_entry (char* entry)
{
int fd = open (journal_filename, O_WRONLY | O_CREAT | O_APPEND, 0660);
write (fd, entry, strlen (entry));
write (fd, “\n”, 1);
fsync (fd);
close (fd);
}
2. readv()/writev()系统调用
将多个数据存储在一起,将驻留在两个或更多的不连接的缓冲区中的数据一次写出去。
UNIX和WINSOCK提供了不同的实现方法UNIX系统下,使用writev,可以指定一系列的缓冲区,收集要写的数据,使可以安排数据保存在多个缓冲区中,然后同时写出去,从而避免出现Nagle和延迟ACK算法的相互影响。名称:readv/writev 功能:散布读/聚集写
头文件:#include <sys/uio.h>
函数原形: ssize_t readv(int filedes,const struct iovec *iov,int iovcnt);
ssize_t writev(int filedes,const struct iovec *iov,int iovcnt);
参数:filedes 文件描述符
iov 指向iovec结构数组的一个指针。
iovcnt 数组元素的个数
返回值:若成功则返回已读、写的字节数,若出错则返回-1
readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数成为散布读和聚集写。
这两个函数的第二个参数是指向iovec结构数组的一个指针:
struct iovec{
void *iov_base;
size_t iov_len;
};
writev以顺序iov[0]至iov[iovcnt-1]从缓冲区中聚集输出数据。writev返回输出的字节总数,通常,它应等于所有缓冲区长度之和。
readv则将读入的数据按上述同样顺序散布读到缓冲区中。readv总是先填满一个缓冲区,然后再填写下一个。readv返回读到的总字节数。如果遇到文件结尾,已无数据可读,则返回0。
下面就是读多个缓冲区的例子:
#include <sys/uio.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
ssize_t size;
char buf1[9];
char buf2[9];
struct iovec iov[2];
fd1=open(argv[1],O_RDONLY);
fd2=open(argv[2],O_RDONLY);
fd3=open(argv[3],O_WRONLY);
size=read(fd1,buf1,sizeof(buf1));
printf(“%s size is:%d\n”,argv[1],size);
size=read(fd2,buf2,sizeof(buf2));
printf(“%s size is:%d\n”,argv[2],size);
iov[0].iov_base=buf1;
iov[0].iov_len=sizeof(buf1);
iov[1].iov_base=buf2;
iov[1].iov_len=sizeof(buf2);
size=writev(fd3,iov,2));
printf(“%s size is:%d\n”,argv[3],size);
close(fd1);
close(fd2);
close(fd3);
}
先用vi或cat建立三个文件(test1,test2,test3),test写入123456789,test写入abcdefghi. test3为空。
然后运行命令:
# ./12_4 test1 test2 test3
在屏幕上会输出:
test1 size is:9
test2 size is:9
test3 size is:18
打开test3,文件内容为123456789abcdefghi.
程序先把test1和test2的内容分别读到缓冲区buf1和buf2中。然后用write把buf1和buf2的内容写至test3.
3. fflush() 功 能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件
原型:int fflush(FILE *stream)
返回值
fflush 的返回值类型是int类型,那么这个int类型具体的返回是什么呢?
使用方法
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>
void flush(FILE *stream);
int main(void)
{
FILE *stream;
char msg[] = "This is a test";
/* create a file */
stream = fopen("DUMMY.FIL", "w");
/* write some data to the file */
fwrite(msg, strlen(msg), 1, stream);
clrscr();
printf("Press any key to flush DUMMY.FIL:");
getch();
/* flush the data to DUMMY.FIL without\
closing it */
flush(stream);
printf("\nFile was flushed, Press any key\to quit:");
getch();
return 0;
}
void flush(FILE *stream)
{
int duphandle;
/* flush the stream's internal buffer */
fflush(stream);
/* make a duplicate file handle */
duphandle = dup(fileno(stream));
/* close the duplicate handle to flush the DOS buffer */
close(duphandle);
}
其它用法
fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准] fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
4. sync()
功能说明:将内存缓冲区内的数据写入磁盘。
语 法:sync [--help][--version]
补充说明:在Linux系统中,当数据需要存入磁盘时,通常会先放到缓冲区内,等到适当的时刻再写入磁盘,如此可提高系统的执行效率。
参 数:
--help 显示帮助。
--version 显示版本信息。
5. session与cache的区别
session 是针对单个连接(会话)来使用的,主要存储和连接相关的上下文信息,比如登录信息等等。
cache 是应用程序级的,主要用来缓存计算结果,减轻服务器负担,并加快响应速度。