欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux程序设计:文件I/O系统调用、open函数、creat函数

程序员文章站 2022-07-14 17:35:04
...

目录

文件I/O系统调用

文件操作方式

open函数

creat函数

close函数


文件I/O系统调用

open() 打开文件
create() 创建文件
close() 关闭文件
read() 读取文件
write() 写入文件
lseek() 文件定位
  • 这些不带缓存的函数都是内核提供的系统调用。
  • 它们不是ANSI C的组成部分,但是POSIX的组成部分。

文件操作方式

  • 系统调用与C库

Linux程序设计:文件I/O系统调用、open函数、creat函数

标准库函数 遵守ISO标准,基于流的I/O,对文件指针(FILE结构体)进行操作
系统调用 兼容POSIX标准,基于文件描述符的I/O,对文件描述符进行操作

open函数

#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);

Linux程序设计:文件I/O系统调用、open函数、creat函数

  • 参数
pathname
  • 要打开或者创建的文件路径
flags
  • 用来说明此函数的多个选择项:
    • O_RDONLY 只读
    • O_WRONLY 只写
    • O_RDWR 读写
mode
  • 新建文件的访问权限,对于open函数而言,仅当创建新文件时才使用第三个参数。
  • open函数的flags参数
    • 用下列一个或多个常数进行或运算构成flags参数(这些常数定义在<fcntl.h>头文件中)
O_RDONLY
  • 以只读方式打开文件
O_WRONLY
  • 以只写方式打开文件
O_RDWR
  • 以读写方式打开文件
O_APPEND
  • 以追加模式打开文件,每次写时都加到文件的尾端,但在网络文件系统进行操作时却没有保证
O_CREAT
  • 如果指定的文件不存在,则按照mode参数指定的文件权限来创建文件
O_EXCL
  • 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在。但在网络文件系统进行操作时却没有保证
O_DIRECTORY
  • 如果参数pathname不是一个目录(其实目录也是文件的一种,也适用于文件操作函数
    ),则open出错
O_TRUNC
  • 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0
O_NONBLOCK
  • 如果pathname指的是一个FIFO、一个块特殊文件(管道文件和设备文件)或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式
  • 可见只能对特定类型的文件设置非阻塞功能,并不是所以文件都能以非阻塞的方式
    打开和进行读写操作
  • 对应的C库函数
FILE *fopen(const char *path,const char *mode);

creat函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
  • 返回: 若成功为只写打开的文件描述符,若出错为-1
  • 功能: 创建一个新文件
  • 此函数等效于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)
  • create的一个不足之处是它以只写方式打开所创建的文件

close函数

#include <unistd.h>
int close(int fd);
  • 返回: 若成功为0,若出错为-1
  • 功能: 关闭一个打开的文件
  • 参数: fd:已打开文件的文件描述符
  • 当一个进程终止时,它所有的打开文件都由内核自动关闭