linux低级文件编程(内核级别)
与高级文件编程使用FILE描述符不同的是,低级文件编程的文件描述符是一个非负整数。
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);
注:只是用一次的临时文件,可以先删除再是用,这样子不必担心忘记删除文件而造成磁盘垃圾文件了。
/*-----临时文件使用模板unlink.c-----*/
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
void main()
{
int fno;
if((fno=open("./tmpfile",O_RDWR|O_CREAT|O_EXCL,0755))<0)
{
fprintf(stderr,"open file error!/n");
return ;
}
unlink("./tmpfile");
sleep(60);
printf("end./n");
}
3.文件读写
#include<unistd.h>
ssize_t read(int fildes,void *buff,size_t nbytes);
ssize_t write(int fildes,const void *buff,size_t nbytes);
/*read函数从文件描述符fildes所指向的文件中读取nbytes个字节的数据到buff所指向的内存中去。如果read成功,函数返回实际读取的字节数;如果文件结束或参数nbytes值为0,函数返回为0;若调用出错,函数返回-1,并将错误码写入errno中。*/
/*write把buff所指向的内存数据向文件描述符fildes所指向的文件中写入nbytes个字节。如write成功,函数返回实际写入的字节数。否则返回-1,并将错误写入errno中*/
/*--------read.c------*/
#include<unistd.h>
void main()/
{
char buff[11];
printf("%d",read(0,buf,sizeof(buf)));
}
/*---------write.c-----*/
#include<unistd.h>
void main()
{
char buf[10]="abcchina";
printf("%d",write(1,buf,sizeof(buf)));
}
4.文件定位
#include<unistd.h>
off_t lseek(int fildes,off_t offset,int whence);
实例:函数lseek允许定位到当前文件最大位置之后,倘若定位成功并且写入数据,则文件将自动延长到写入位置,中间部分以0填充。但是若定位位置大大超过了当前文件长度,则UNIX操作系统只虚增文件长度,实际并不分配磁盘块。以下设计虚增文件的实例:
#include<unistd.h>
#include<fcntl.h>
void main()
{
int fno;
if((fno=open("hole.dat",O_WRONLY|O_CREAT,0755))<0)
{
printf("open file hole.dat failed./n");
return ;
}
lseek(fno,1000000000,SEEK_SET);
write(fno,"eee",3);
close(fno);
}
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)文件锁
多用户多任
- 发表评论
-
- 最新评论 进入详细评论页>>