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

概要:

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

打开、创建和关闭文件

函数原型:
#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结构体指针

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

时间: 2024-11-08 22:58:10

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

Linux下基于文件描述符的文件操作(非缓冲)

1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权

基于文件描述符的文件操作(非缓冲)

1.1. 文件描述符:内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0-1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作.常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcnt

五、基于文件描述符的文件操作(非缓冲)

1文件描述符 内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcntl(控

Linux下c函数dlopen实现加载动态库so文件代码举例

dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了.可以在自己的程序中使用 dlopen().dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现.它需要两个参数:一个文件名和一个标志.文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性.如果设置为 RTLD_NOW 的话,则立刻计算:如果设置的是 RTLD_LAZY,则在需要

linux下oracle11G DG搭建(二):围绕主库搭建操作

环境 名称 主库 备库 主机名 bjsrv shsrv 软件版本 RedHat Enterprise5.5.Oracle 11g 11.2.0.1 RedHat Enterprise5.5.Oracle 11g 11.2.0.1 二.围绕主库操作: 1.主库-修改初始化参数 SQL> show parameter spfile; NAME                 TYPE        VALUE ------------------------------------ --------

文件描述符和文件指针的区别

文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数.每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针. 文件指针:C语言中使用文件指针做为I/O的句柄.文件指针指向进程用户区中的一个被称为FILE结构的数据结构.FILE结构包括一个缓冲区和一个文件描述符.而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符

浅谈文件描述符与文件指针

一.文件描述符: 内核利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符. 1.优点: 1.基于文件描述符的I/O操作兼容POSIX(可移植操作系统接口)标准 2.UNIX/LINUX的系统调用中,大量系统调用都依赖于文件描述符 2.缺点: 1.在非UNIX/LINUX操作系统上,无法基于这一概念进行编程 2.它在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数是数据,哪些是文件描述符.所以完成的代码

文件描述符、文件描述符表、打开文件表、目录项、索引节点之间的联系

文件描述符.文件描述符表.打开文件表.目录项.索引节点之间的联系如下图所示: 每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体. 在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos).在上图中,进程1和进程2都打开同一文件,

文件描述符、文件表项、V节点表项的一些总结

转自  http://blog.csdn.net/gzzheyi/article/details/7739556 表格可以参见APUE 第三版 P61. 文件描述符(进程级别): 1).在每个进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视察为一个矢量(数组),每个描述符占用一项.与每个文件描述符相关联的是: (a).文件描述符标志. (b).指向一个文件表项的指针.(不同的文件描述符可以指向同一个文件表项,例如用dup函数复制文件描述符,得到一个新的文件描述符,但是它们指向

3.4 对于指定的描述符打印文件标志

file/fileflags.c #include "apue.h" #include <fcntl.h> int main(int argc, char *argv[]) { int val; if (argc != 2) err_quit("usage: a.out <descriptor#>"); if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) err_sys("fcn