Unix下C语言----低级文件编程

本文详细阐述了文件的打开与创建、文件的关闭与删除、文件读写、文件定位、文件缓冲、复制文件描述符以及文件控制等关键概念,特别是文件锁机制在多用户多任务操作系统中的应用。通过实例演示了如何使用文件锁来保护敏感数据免受并发操作的影响。

  1.文件的打开与创建

  #include<fcntl.h>

  int open(const char * filename,int oflag,.../*mode_t mode*/);

  --filename指定了打开或创建文件的路径名;

  --oflag制定了打开或创建文件的方式

  --mode是可选参数,决定新文件的模式,仅当创建文件时有效。

  当函数调用成功时,将为文件filename创建一个文件描述符并返回之,否则返回-1;

  参数oflag控制打开文件的读写方式{1.O_RDONLY、O_WRONLY、O_RDWR}、常规方式和同步方式;

2.文件的关闭与删除

  函数close关闭一个已经打开的文件,函数unlink删除文件,它们的原型为:

  #include<unistd.h>

  int close(int fildes);

  int unlink(char *path);

 

  注:只是用一次的临时文件,可以先删除再是用,这样子不必担心忘记删除文件而造成磁盘垃圾文件了。

 

3.文件读写

 

4.文件定位

#include<unistd.h>

off_t lseek(int fildes,off_t offset,int whence);

实例:函数lseek允许定位到当前文件最大位置之后,倘若定位成功并且写入数据,则文件将自动延长到写入位置,中间部分以0填充。但是若定位位置大大超过了当前文件长度,则UNIX操作系统只虚增文件长度,实际并不分配磁盘块。以下设计虚增文件的实例:

 

 

5.文件缓冲

  函数fsync将缓冲信息写入文件中,它的原型为:

  #include<unistd.h>

  int fsync(int fildes);

  系统调用fsync将所有已写入文件描述符fildes的数据真正写到磁盘或其它设备中,类似于标准文件变成库fflush,当系统调用成功时返回0,否则返回-1。

 

6.复制文件描述符

  低级文件编程库中复制文件描述符的函数如下:

  #include<unistd.h>

  int dup(int fildes);

  int dup2(int fildes,int fildes2);

  函数dup复制文件描述符fildes到当前未使用的最小可用描述符中。函数dup2复制文件描述符fildes到描述符fildes2中,如果fildes2已经打开,则关闭;如果fildes2与fildes值相等,则直接返回。这两个函数在调用成功时都返回新的文件描述符,否则返回-1。

 

 

7.文件控制

 

  1)文件锁

     多用户多任务操作系统中非常重要的一个内容就是文件锁。用户在更新文件时,期望可以使用某种机制,防止两种进程同时更新文件同一区域而造成丢失,或者防止文件内容在未更新完毕时被读取等并发引起的问题,这种机制就是文件锁。

     进程在操作文件期间,可以使用文件锁,锁定文件中的敏感部分,防止其他进程越权操作该部分数据。函数fcntl提供了对文件任意区域置锁的能力,既可以锁住全部文件,又可以锁住文件的部分记录,故文件锁又成为"记录锁".

     根据文件锁的访问方式,可以区分读锁和写锁两种。读锁又名共享锁,它用来防止进程读取的文件记录被更改。文件记录可以同时设置多个读锁,但当有一个读锁存在时,就不能在该记录出设置写锁。

     写锁又名互斥锁,它用来保证文件更改记录时不被干扰,确保文件一致性和完整性,防止写丢失或读"脏"数据。文件记录一旦设置了写锁,就不能再设置任意锁,除非写锁接触。

    文件记录在同一时刻,可以设置多个读锁,单仅能设置一个写锁,并且读、写不能不能同时存在。

    当函数fntl专用于锁操作时,其原型为:

    int fcntl(int fildes,int cmd,struct flock *arg);

    其中,结构flock用于描述文件锁的信息,定义于"fcntl.h"中,如下表示:

   

    当函数fcntl专用于锁时,参数cmd的三种取值:

     F_GETLK

     F_SETLK

     F_SETLKW

     {文件锁最典型的应用于两个方面:一个锁定文件中的临界数据,比如并发投票时文件记录的投票数;二是利用具有互斥性质的写锁,实现进程的并发控制}

   2)文件锁操作

     在锁机制的使用中,最常见的操作有锁的请求、释放和测试等,这些操作代买基本类似

   (1)测试锁

   设计函数SeeLock,它查询文件描述符fd对应文件的锁信息,其原型为:

   void SeeLock(int fd,int start,int len);

   函数查询描述符fd对应文件从偏移start出开始的len字节中的锁信息

  

   (2)申请读锁

    共享锁申请函数GetReadLock,原型为:

    void GetReadLock(int fd,int start,int len);

    以阻塞模式在文件描述符fd相应的文件中申请共享读锁,锁定的区域从偏移start处开始的len字节

   

   (3)申请写锁

    void GetWriteLock(int fd,int start,int len);

   

   (4)释放锁

    设计文件锁释放函数ReleaseLock,原型为:

    void ReleaseLock(int fd,int start,int len);

   

 

   以下是一个文件锁控制进程的实例,如下:

  

 

8.通过函数库之读写功能库封装

 

     本类函数包括阻塞读写和定时读写两种 

   1)阻塞读写函数库

   (1)ReadFile

    控制read的读取文件字节数函数,其原型为:

    int ReadFile(int nFile,void *pData,int *pSize);

    函数从文件描述符nFile所指向的文件中读取nSize个字节的数据到内存pData中,仅当错误发生,或者全部数据读取完毕时,函数返回。

   (2)WriteFile

     控制write的写入文件字节数函数,原型为:

     int WriteFile(int nFile,void *pData,int nSize);

    

   2)阻塞读写函数库应用实例

 

      程序读取键盘输入,当且仅当读入了一定量的字符数后函数才返回,如下:

     

     

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值