[GNU/Linux] Linux系统调用-文件操作(一)

8 篇文章 0 订阅

POSIX 错误处理
POSIX函数若执行时发生错误,大部分函数都将设置全局变量errno,以下内容若未特别提及,均在执行失败时设置了errno。
各个errno变量可以取的常数值可以使用man 3 errno查看man手册得知。

打开文件

函数功能: 打开文件并返回文件描述符,其他功能视参数而定。

函数原型及解释

int open(const char *path, int oflag, ...);

//一般使用的两种形式:
int open(const char *path, int oflag);
int open(const char *path, int oflag, mode_t mode);
  • 返回值:若执行成功则返回该文件描述符,失败则返回-1
  • path:要打开的文件位置,既可以是绝对路径也可以是相对路径。
  • oflag:打开文件的方式。
  • mode:仅当oflag设置了O_CREAT时有效,要创建的文件的权限。

参数

其中参数oflag可选项有:

选项(以下五选一)说明
O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR读写打开
O_EXEC只执行打开
O_SEARCH(仅对目录有意义)只搜索打开
选项(以下任选)说明
O_APPEND每次写文件时都追加到文件的尾部
O_CLOEXECFD_CLOEXEC设置为文件描述符标志
O_CREAT若该文件不存在则创建
O_EXCL(指定了O_CREAT)若文件已存在则报错
O_NOFOLLOW若文件是一个符号链接则报错
O_SYNC对文件的修改将阻塞直到物理磁盘上同步为止
O_DIRECTORY若文件不是一个目录则失败
O_NONBLOCK以非阻塞的方式打开文件
O_NDELAY以非阻塞方式打开文件
O_TRUNC当文件存在并以可写方式打开则截断文件至0

创建文件

函数功能:创建一个文件。

函数原型及解释

int creat(const char *path, mode_t mode);
  • 返回值:若执行成功则返回该文件描述符,失败则返回-1
  • path:要创建的文件名,这里可以使用绝对路径也可以使用相对路径。
  • mode:要创建的文件的权限、类型。

关闭文件

函数功能:关闭文件描述符,同时将释放进程施加在该文件上的所有记录锁。

函数原型及解释

int close(int fildes);
  • 返回值:若执行成功则返回0,失败则返回-1
  • fildes:要关闭的文件描述符。

设置文件的权限

函数功能:设置文件的权限。

函数原型及解释

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
  • 返回值:若执行成功则返回0,失败则返回-1
  • path:要设置权限的文件位置,既可以使用绝对路径也可以使用相对路径。
  • fd:要设置权限的文件的文件描述符。
  • mode:要设置的权限。

读文件

函数功能:从文件中读取一定的字节。

函数原型及解释

ssize_t read(int fildes, void *buf, size_t nbyte);
  • 返回值:若执行成功则返回0,失败则返回-1
  • fildes:要读取的文件的文件描述符。
  • buf:存放读取出的内容的缓冲区。
  • nbyte:要读取多少字节。

额外的说明

readwrite是无缓冲的IO函数,使用时务必保证buf参数中的空间足够,而且与nbyte参数指定的字节数相匹配。另外readwrite都是直接操作二进制内容,并不能“智能”的识别buf参数中的类型并转换,使用时务必注意。

写文件

函数功能:将指定的内容写入文件。

函数原型及解释

ssize_t write(int fildes, const void *buf, size_t nbyte);
  • 返回值:若执行成功则返回0,失败则返回-1
  • fildes:要写入的文件描述符。
  • buf:从该位置中读取要写入的内容。
  • nbyte:要写入多少字节。

读写指针的移动

函数功能:移动读写指针

函数原型及解释

off_t lseek(int fildes, off_t offset, int whence);
  • 返回值:若执行成功则返回移动后距离文件首的字节数,失败则返回-1
  • fildes:要移动读写指针的文件描述符。
  • offset:将指针移动到对于参数whence表示的位置的偏移量。
  • whence:表示要将指针移动到的位置的参考位置。

参数

whence参数的可选项有:

选项表示
SEEK_SET表示offset参数是相对于文件头的偏移
SEEK_CUR表示offset参数是相对于当前位置的偏移
SEEK_END表示offset参数是相对于文件尾的偏移

当选择SEEK_END并将offset取得正数值时,中间内容将以二进制0填充。

复制文件描述符

函数功能:复制一个文件描述符

函数原型及解释

int dup(int fildes);
int dup2(int fildes, int fildes2);
  • 返回值:若执行成功则返回产生的新文件描述符,失败则返回-1
  • fildes:要复制的文件描述符。
  • fildes2:指定复制后的新的文件描述符。若fildes等于fildes2,函数dup2将什么也不做。若fildes2已经被其他文件使用,则会先释放这个文件描述符。

文件控制

函数功能:视参数而定。

函数原型

int fcntl(int fildes, int cmd, ...);

//常见的使用形式:
int fcntl(int fildes, int cmd, long arg);
int fcntl(int fildes, int cmd, struct flock *lock);

各个功能的解释

fcntl函数根据cmd参数的不同有不同的功能,但都对fildes表示的文件描述符进行操作。
1. F_DUPFD:此时fcntl函数的功能与dup函数的功能相同,返回值也相同。
2. F_GETFD:获取fildes表示的文件的close_on_exec标志值。若执行成功则返回该标志值,失败则返回-1
3. F_SETFD:此时需要额外提供arg参数,设置fildes表示的文件的close_on_exec标志值,设为arg参数的最后一位。若执行成功则返回0,失败则返回-1
4. F_GETFL:获得fildes表示的文件的打开方式(即open函数的oflag参数)。若执行成功则返回0,失败则返回-1
5. F_SETFL:设置fildes表示的文件的打开方式,这里只可以设置O_APPENDO_NONBLOCKO_ASYNC三种属性。
6. F_SETLK:以下三个功能需要额外提供lock参数。对fildes表示的文件加锁或释放锁。若执行成功则返回0,失败则返回-1
7. F_SETLKW:与F_SETLK功能基本相同,区别是若设置了这个标志,在文件被使用时将等待文件被释放。
8. F_GETLK:试探fildes表示的文件是否可以设置为lock,但不会真的设置为该值。

设备控制

函数功能:控制流设备。

函数原型及解释

int ioctl(int fildes, int request, ...);
  • fildes:要控制的文件描述符。
  • request:要进行的操作,视参数的不同还需要在这里添加其他参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值