码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下的文件操作(2)——基于文件描述符的文件操作

时间:2019-04-12 23:12:47      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:存在   strong   lseek   计算   获取文件信息   open()   pat   多进程   UNC   

概要:

  • 打开、创建和关闭文件
  • 读写文件
  • 文件定位
  • 获取文件信息

打开、创建和关闭文件

函数原型:
#include <sys/types.h> //头文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //文件名 打开方式
int open(const char *pathname, int flags, mode_t mode);//文件名 打开方式 权限

flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,mode表示文件的访问权限。

flags 的选项:

技术图片

  • O_CREAT参数:
#include <func.h>
int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDONLY|O_CREAT);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    return 0;
}

open()函数出错时返回-1,创建成功时返回未使用的最小文件描述符

0 标准输入符

1 标准输出符

2 标准错误输出符

故该代码中open()返回值为3

技术图片

  • O_CREAT加自定义权限:

当输入的文件名不存在时,自动创建文件,但该文件权限是有问题的,所以在open()函数后加上自定义权限参数

#include <func.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDONLY|O_CREAT,0600);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    return 0;
}

技术图片

若文件已存在则跳出,否则创建文件:

#include <func.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDONLY|O_CREAT|O_EXCL,0600);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    return 0;
}

TRUNK参数:若文件已存在截断内容为0

#include <func.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDONLY|O_TRUNC,0600);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    return 0;
}

技术图片

close用于文件的关闭:

int close(int fd);//fd表示文件描述词,是先前由open或creat创建文件时的返回值。

文件使用完毕后,应该调用close关闭它,一旦调用close,则该进程对文件所加的锁全都被释放,并且使文件的打开引用计数减1,只有文件的打开引用计数变为0以后,文件才会被真正的关闭。


读写文件

函数原型:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);//文件描述词 缓冲区 长度

ssize_t write(int fd, const void *buf, size_t count);

对于read和write函数,出错返回-1,读取完了之后,返回0, 其他情况返回读写的个数

read.c

#include <func.h>
int main(int argc, char* argv[])
{
    ARGS_CHECK(argc, 2);
    int fd;
    fd = open(argv[1], O_RDONLY);
    ERROR_CHECK(fd, -1, "open");
    printf("fd = %d\n", fd);
    int ret;
    ret = read(fd, buf, sizeof(buf));
    ERROR_CHECK(ret, -1, "read");
    printf("buf = %s\n", buf);
    return 0;
}

write.c

#include <func.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDWR);
    ERROR_CHECK(fd,-1,"open");
    printf("fd = %d\n",fd);
    int arr[5]={1,2,3,4,5};
    int ret;
    ret=write(fd,arr,sizeof(arr));
    ERROR_CHECK(fd,-1,"write");
    lseek(fd,0,SEEK_SET);   //从文件头开始计算
    memset(arr,0,sizeof(arr));
    ret=read(fd,arr,sizeof(arr));
    ERROR_CHECK(fd,-1,"read");
    printf("ret = %d,arr[0] = %d,arr[3] = %d\n",ret,arr[0],arr[3]);
    return 0;
}

文件定位

函数lseek将文件指针设定到相对于whence,偏移值为offset的位置

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);//fd文件描述词

whence 可以是下面三个常量的一个
SEEK_SET 从文件头开始计算
SEEK_CUR 从当前指针开始计算
SEEK_END 从文件尾开始计算

  • 文件空洞——通常用于多进程间通信的时候的共享内存
#include <func.h>
int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDWR);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    int ret;
    ret=lseek(fd,1024,SEEK_SET);
    printf("lseek ret=%d\n",ret);
    char c='H';
    write(fd,&c,sizeof(c));
    close(fd);
    return 0;
}

技术图片

技术图片

  • 改变文件大小
#include <func.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,2);
    int fd;
    fd=open(argv[1],O_RDWR);
    ERROR_CHECK(fd,-1,"open");
    printf("fd=%d\n",fd);
    int ret;
    ret=ftruncate(fd,1024);
    ERROR_CHECK(ret,-1,"ftruncate");
    close(fd);
    return 0;
}
获取文件信息

fstat和stat函数获取文件信息,调用完毕后,文件信息被填充到结构体struct stat变量中,函数原型为:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *file_name, struct stat *buf); //文件名 stat结构体指针

int fstat(int fd, struct stat *buf); //文件描述词 stat结构体指针

Linux下的文件操作(2)——基于文件描述符的文件操作

标签:存在   strong   lseek   计算   获取文件信息   open()   pat   多进程   UNC   

原文地址:https://www.cnblogs.com/Mered1th/p/10699085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!