fcntl.h函数库的常用函数使用

本文详细介绍了fcntl.h函数库中的常用函数,包括打开、关闭文件、读取和写入数据等基本操作。同时,还提供了关于文件描述符操作、文件锁定、数据同步等方面的函数介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这节学习fcntl.h函数库中的几个常用的原型函数,通过这些常用的原型函数完成编程中对文件的打开、数据写入、数据读取、关闭文件的操作。

定义

头文件:

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

打开文件

1、函数定义:int open( const char * pathname, int flags);
2、函数定义:int open( const char * pathname,int flags, mode_t mode);

返回值:成功则返回文件描述符,否则返回-1

函数说明:

  • 参数pathname 指向要打开的文件路径

  • 参数flags 定义以什么权限打开要修改的文件,flash分为单独权限操作和组合权限操作,具体如下

flags单独使用:

 O_RDONLY   # 以只读方式打开文件
 O_WRONLY   # 以只写方式打开文件
 O_RDWR     # 以读写方式打开文件

flags利用OR(|)运算符组合使用

 O_CREAT            # 若欲打开的文件不存在则自动建立该文件。
 O_EXCL or O_CREAT  # 检查文件是否存在,若不存在则建立该文件
 O_CREAT or O_EXCL  # 如果打开的文件为符号连接,则会打开文件失败。
 O_NOCTTY           # 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
 O_TRUNC            # 若文件存在并且以可写的方式打开时,文件中的内容将被清空。
 O_APPEND           # 当读写文件时会从文件尾开始移动,将后面要写入的数据会以附加的方式加入到文件后面。
 O_NONBLOCK         # 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
 O_NDELAY           # 与 O_NONBLOCK 相同。
 O_SYNC             # 以同步的方式打开文件。
 O_NOFOLLOW         # 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
 O_DIRECTORY        # 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。
 O_NOATIME          # 从linux 2.6.8内核开始,读文件不更新文件最后访问时间

这里不讲解第2个函数的使用!

关闭文件

函数定义:int close(int fd);

返回值:若文件顺利关闭则返回0,发生错误时返回-1

函数说明:

当使用完文件后若已不再需要可使用该函数关闭文件,close()会让数据写回磁盘,并释放该文件所占用的资源。

参数fd为先前由open()creat()所打开的文件名。

读取数据

函数定义:ssize_t read(int fd,void * buf ,size_t count);

返回值:

  • 若参数count为0,则read()不会有作用并返回0。

  • 若参数count不为0,则返回要求读取的count个字节数,如果返回0,表示已到达文 件尾或者无法读取文件的数据

函数说明:read()函数把参数fd 所指的文件传送count个字节到buf指针所指的内存中。如果顺利read()会返回实际读到的字节数,在编程时最好使用该返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾或发生了其它的异常,当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。

注意:使用read()函数时要求文件处于打开状态,此外文件读写位置会随读取到的字节移动。

写入数据

定义函数:ssize_t write (int fd,const void * buf,size_t count);

返回值:如果正常write()会返回实际写入的字节数,当有错误发生时则返回-1

函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。文件读写位置会随写入的字节数移动。当写入异常时,错误代码存入errno中。错误代码EINTR 此调用被信号所中断。EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。EADF 参数fd非有效的文件描述词,或该文件已关闭。

注意:使用write()函数时要求文件处于打开状态,此外文件读写位置会随写入的字节数移动。

其它函数

  • creat(建立文件)

函数定义:int creat(const char * pathname, mode_tmode);
  • dup(复制文件描述词)

函数定义:int dup (int oldfd);
  • dup2(复制文件描述词)

函数定义:int dup2(int odlfd,int newfd);
  • fcntl(文件描述词操作)

函数定义:

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd,long arg);
int fcntl(int fd, int cmd,struct flock * lock);
  • flock(锁定文件或解除锁定)

函数定义:int flock(int fd,int operation);
  • fsync(将缓冲区数据写回磁盘)

函数定义:int fsync(int fd);
  • lseek(移动文件的读写位置)

函数定义:off_t lseek(int fildes,off_t offset ,int whence);
  • sync(将缓冲区数据写回磁盘)

函数定义:int sync(void);
### 关于 `fcntl.h` 的详细介绍 #### 功能概述 `fcntl.h` 是 C 语言中的一个重要头文件,主要用于定义一系列针对文件描述符的操作函数。通过这些函数可以实现对文件的各种控制操作,如打开和关闭文件、锁定文件以及改变文件的访问模式等[^1]。 #### 主要功能列表 - **文件管理**:支持创建新文件或者获取现有文件的信息;能够执行诸如读取、写入数据到指定位置的任务。 - **权限设置**:允许应用程序设定特定文件或目录上的存取权限。 - **同步机制**:提供接口来确保多个进程之间共享资源的安全性,比如利用锁机制防止并发冲突。 - **状态调整**:修改已经打开文件的状态标志位(例如只读/可读写),从而影响后续对该文件的所有 IO 行为。 #### 函数原型示例 以下是 `fcntl()` 函数的一个典型声明形式: ```c #include <fcntl.h> // ... int fcntl(int fd, int cmd, ... /* arg */ ); ``` 此 API 接受三个参数: - `fd`: 文件描述符; - `cmd`: 命令码,指示所请求的具体动作; - 可选第三个参数取决于第二个参数的选择情况,可能是指向结构体指针或其他类型的值[^2]。 #### 实际应用案例 为了更好地理解如何运用上述提到的功能,这里给出一段简单的代码片段演示怎样使用 `fcntl()` 来处理文件加锁的情况: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> void lock_file(const char* path){ int file_desc; struct flock fl; if ((file_desc = open(path,O_RDWR)) == -1) { perror("open"); exit(EXIT_FAILURE); } fl.l_type = F_WRLCK; // 设置为写锁 fl.l_whence = SEEK_SET; fl.l_start = 0L; fl.l_len = 0L; // 锁定整个文件 if (fcntl(file_desc,F_SETLK,&fl)==-1){ printf("%s is locked by another process\n",path); close(file_desc); return ; } } ``` 这段程序尝试给定路径下的文件加上一个独占性的写入锁,如果成功则继续运行其他逻辑;否则提示用户该文件正被别的进程占用并退出当前流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值