Linux 系统编程 开篇/ 文件的打开/创建

从本节开始学习关于Linux系统编程的知识!

学习Linux的系统编程有非常多的知识点,在应用层面,很重要的一点就是学习如何“用代码操作文件来实现文件创建,打开,编辑等自动化执行

那如何自动化实现对文件的创建,打开,编辑等呢?答案就是使用Linux系统提供的一系列API函数(如 open, write/read, lseek,close等等)。

打开/创建文件

需要包含的头文件:

#include 
#include 
#include 

相关的API函数: 

int open(const char *pathname, int flags); //pathname是文件路径,flags是权限
int open(const char *pathname, int flags, mode_t mode);

int creat(const char *pathname, mode_t mode);

open函数

当调用open打开一个文档之后,open函数会返回一个非负整数,这个整数就是文件描述符

如果对一个文档都进行了open,并返回了“2”,之后又想对其进行write,就是write(2)

如果返回为负数,则说明open失败!

参数说明

pathname

  • 要打开的文件名(含路径)

flags : 

  • O_RDONLY 只读打开
  • O_WRONLY 只写打开
  • O_RDWR 可读可写打开

当附带了权限后,打开的文件就只能按照这种权限来操作

以上这三个参数中应当只指定一个。下列参数是可选择的:

  • O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode.用其说明该新文件的存取许可权限。
  • O_EXCL:以这种属性去打开文件时,如果同时指定了O_CREAT,而文件已经存在,则打开文件失败(也可以说返回值是-1)。
  • O_APPEND:以这种属性去打开文件时,每次写时都加到文件的尾端。(不想写入时文件被覆盖,用这个flag,正常写入没有加其他条件的话,原来文件中的数据内容会被覆盖,注意是覆盖,覆盖本身的字节长度,没有覆盖的会保留,不是删除)
  • O_TRUNC:以这种属性去打开文件时,如果这个文件中本来是有内容的, 而且为只读或只写成功打开,则将其长度截短为0,通俗点的意思就是把原来的文件中的内容干掉,写入你自己要的数据内容
  • Mode:一定是在flags中使用了 O-CREAT 标志, mode 记录待创建的文件的访问权限

关于mode的值和权限的对应关系:

共有三种权限

  • 是否可读(r), 对应数字4
  • 是否可写(w), 对应数字2
  • 是否可执行(x), 对应数字1

共有三个权限分配的对象

  • 主用户(CLC)
  • 同组用户
  • 其他组用户

比如:给的是0600时,则对应权限“-rw-------”,即只给主用户分配可读可写(4+2=6)的权限同组用户(第三位)和其他组用户(第四位)没有任何权限

实操演示

1. 创建一个名为“FILE”的文件夹,将文件部分的学习代码都放进去,并在cmd中cd到FILE:

2. 使用touch指令创建一个新的文件:

关于touch指令,可以参考:

Linux命令之touch命令_touch linux_恒悦sunsite的博客-CSDN博客

3.  使用vi命令创建一个c文件:

关于vi模式下的一些操作,之前接触过,参考:

Linux 系统初识_mjmmm的博客-CSDN博客

4.  使用man命令查看open相关的函数:

man的使用参考:

Linux下的man命令_linux man命令_邓永豪的博客-CSDN博客

简单来说就是 “man + 函数对应的手册号 + 函数名” 其中手册号是1~9,常用前3个,实在不知道可以一个个试

Linux 系统编程 开篇/ 文件的打开/创建_第1张图片

然后就可以看到对于open函数的描述,这样就方便在Linux系统里面直接查阅和复制

5. 编写demo1.c,然后保存退出:

#include 
#include 
#include 
#include 

int main()
{       
        int fd; // file description
        fd = open("./file1",O_RDWR);
        
        printf("file description = %d\n",fd);
        return 0;
}       

 6. 运行demo1.c:

可见,我创建的文档“file1”被自动打开,并分配了文件描述符“3”

7. 此时,如果将 file1 删除,再执行一遍代码:

可见,返回-1,返回失败

O_CREAT参数的应用

可是在实际应用中,我如果不希望如果一个文件不存在就直接返回失败,那么可以在open函数中,添加上面提到的“O_CREAT”参数,就可以“若文件不存在则创建它”,并按要求增加“mode”参数:

#include 
#include 
#include 
#include 

int main()
{
        int fd; // file description
        fd = open("./file1",O_RDWR|O_CREAT, 0600); //0600代表即将创建的文件“可读可写”

        printf("file description = %d\n",fd);
        return 0;
}

此时,在file1不存在的情况下open,依然会返回正常的文件标识符,并创建file1:

Linux 系统编程 开篇/ 文件的打开/创建_第2张图片

O_EXCL参数的应用

O_APPEND参数的应用

O_TRUNC参数的应用

creat函数

参数说明

实操演示

你可能感兴趣的:(linux,运维,系统编程)