linux下的文件缓冲IO

来源:互联网 发布:access数据库管理软件 编辑:程序博客网 时间:2024/04/29 15:20
1 dup / dup2
 复制一个现有的文件描述符时,不会赋值文件表。出现多个文件描述符对应同一张文件表的情况
 dup()复制时系统会自动选择一个位置用的文件描述符,通常选择未使用的最小值
 dup2()是程序员指定的新的文件描述符,如果已被使用,则会强行关闭源文件后继续为我所有。
 dup.c
 他们经常用来重定向进程的stdin stdout stderr  
2.fcntl
 #include<fcntl.h>
 int fcntl(int fd, int cmd)
 int fcntl(int fd, int cmd, long arg)
 可以改变已打开文件的性质,提供5种控制文件的功能:
 2.1 复制一个现有的文件描述符 (F_DUPFD)
     复制文件描述符,需要第三个参数作为新的文件描述符值
 和dup2的区别,则找到大于该值且未被使用的最小值代替。
fcntl.c
 2.2 获得或者设置文件描述符标记(F_GETFD F_SETFD)
 2.3 获得或者设置文件状态(F_GETFL F_SETFL)
 2.4 获得后者设置异步I/O所有权(...)
 2.5 获得或者设置记录锁(F_GETLK F_SETLK F_SETLKW)(重点)
    1)对于多进程同时操作一个文件,引入了锁机制。文件锁机制解决的是多进程操作时操作同一个文件产生
   数据冲突的问题。
2)同一进程内部文件锁没有效果。文件锁允许多个进程同时读,不允许同时写。也循序多个进程同时读
   写。因此文件锁分为读锁和写锁。
3)读锁针对读操作,效果允许其它进程继续给该文件加读锁执行读操作,但不允许给该文件加写操作执行
   写操作。
4)写锁针对写操作,效果不允许其它进程继续给该文件加读锁或者写锁进行读或者写操作。
 
文件爱你锁的使用包含一个函数 + 一个数据结构
   函数: fcntl()
   数据结构:
     struct flock
 {
...
short l_type; //指明锁的类型:F_RDLCK  F_WRLCK  F_UNLCK
short l_whence; //可以锁文件的一部分:SEEK_SET SEEK_CUR SEEK_END
off_r l_start; //相对于whence偏移的位置(起始位置)
off_t l_len;//需要被锁的字节数
pid_t l_pid; //上锁的进程
...
 }
fcntl(fd, cmd, arg)
cmd取值:
      F_GETLK:测试是否可以加锁
  F_SETLK:设置锁状态为lock.l_type, 加/解锁
  F_SETLKW:加锁的时候,如果加锁不成功则一直等待,f
            加锁不成功fcntl()函数不会返回

文件锁的特点:
   1)可以加锁整个文件,也可以加锁文件的一部分
   lock1.c:a.txt 10~30 加读锁
lock2.c: a.txt 0~20  加读锁 成功
              20~30 加写锁 失败  
2)上锁的方式有两种:
                   F_SETLK:加锁定失败,立即返回-1
F_SETLKW:wait,加锁不成功不反回
lock3.c
3)文件锁其实并不能锁定读写函数,只能阻止其它进程的加锁行为,导致其它进程加不上锁。
  因此文件锁的正确用法:在调用read之前加读锁,在调用write之间加写锁,读写完之后立刻释放锁。
  如果在加锁之前可以获取一下文件锁的状态预测一下加锁是否成功。F_GETLK
  
  lock4.c:尝试给a.txt 0~20 是否可以加读锁
                       20~50 是否可以加写锁
4)文件锁解决的是多进程操作同一个文件产生的数据冲突的问题,同一个进程间的锁无效
5)进程退出时,属于该文件的所有锁均被释放
6)建议性锁,而非强制性锁
3 stat函数
        获取硬盘上文件的属性信息
        ls -il
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat
{
dev_t st_dev;
ino_t st_ino;    //inode number
mode_t st_mode;  //
nlink_t st_nlink;
uid_t st_uid;    //
gid_t st_gid;
dev_t st_rdev;   //
off_t st_size;   //the size of the file
blksize_t st_blksize;
blkcnt_t st_blocks;
time_t st_atime;
time_t st_mtime;  //time of last modification
time_t st_ctime;  //time of stus of change
}
4 remove函数
#include <stdio.h>
int remove(const char *pathname)
--------------------------------
标C:remove(filename)
UC:unlink(删除一个文件)      
     int unlink(const char *pathname)
删除一个文件,要删除的文件正在被某个进程打开或使用,其内容直到该文件被关闭后才会正真删除。

unlink1.c
unlink2.c
在实际项目中通常会使用一些临时文件时,当使用者打开了该文件就可以使用unlink()来删除动作。
 
umask

5 其它的一些函数
access 文件是否存在以及相关权限
umask  为进程创建屏蔽字
chmod  改变文件的权限
chown  改变文件的所有者
truncate 文件截断
create 创建文件(几乎没人用,废弃)
0 0
原创粉丝点击