linux编程常用函数说明

本文深入探讨了Linux系统中的关键文件系统管理函数:fsync(), readv()/writev(), 和 sync()。详细解释了这些函数的功能、使用方法及实例应用,包括如何同步内存文件数据到储存设备、高效地读取和写入多个非连续缓冲区以及数据刷新和磁盘同步操作。通过实例代码展示了函数的实际应用,旨在帮助开发者更好地理解和运用这些核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. fsync() 函数同步内存中所有已修改的文件数据到储存设备

头文件
#include <unistd.h>

函数原型
int fsync(int fd);

说明
fsync函数同步内存中所有已修改的文件数据到储存设备。参数fd是该进程打开来的文件描述符。 函数成功执行时,返回0。失败返回-1,errno被设为以下的某个值

  EBADF: 文件描述词无效
  EIO : 读写的过程中发生错误
  EROFS, EINVAL:文件所在的文件系统不支持同步
  调用 fsync 可以保证文件的修改时间也被更新。fsync 系统调用可以使您精确的强制每次写入都被更新到磁盘中。您也可以使用同步(synchronous)I/O 操作打开一个文件,这将引起所有写数据都立刻被提交到磁盘中。通过在 open 中指定 O_SYNC 标志启用同步I/O。

使用方法
#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);
}

2readv()/writev()系统调用

       将多个数据存储在一起,将驻留在两个或更多的不连接的缓冲区中的数据一次写出去。

  UNIXWINSOCK提供了不同的实现方法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类型具体的返回是什么呢?

  如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
  注意:如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数。

使用方法
#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 是应用程序级的,主要用来缓存计算结果,减轻服务器负担,并加快响应速度。




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值