Linux文件操作之打开及创建过程

 更新时间:2026年08月25日 09:20:32   作者:嵌入式JunG  
还在为Linux下C语言open函数的参数和权限设置头疼吗?本文详细讲解open函数的头文件、pathname、flags和mode参数,以及文件描述符和返回值,并对比creat函数,通过代码示例让你快速掌握文件打开与创建,提升编程效率

打开(open)

使用open函数需要包含以下三个头文件:

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

open的函数定义格式

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);

函数定义的参数解读

1.pathname:指向文件的路径

指定文件格式:./文件夹名字/指定文件名字

当前文件格式:./当前文件名字

2.flags:文件权限(分为两种情况)

第一种:(只能选择并执行其中一个)

1、O_RDONLY 只读打开

2、O_WRONLY 只写打开

3、O_RDWR 可读可写打开

当我们附带了权限后,打开的文件就只能按照这种权限来操作。以上这三个常数中应当只指定一 个。

第二种:(可以选择多种同时进行)

注:在执行第二种时,其格式是与第一种并在一起,两者中间需要加一个 '|'

1.O_CREAT:若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

结构如下:(最后一部分代码可为此做展现)

fd = open("./file1",O_RDWR|O_CREAT,0600);//fd为open的文件描述符,如果没有该文件,则创建一个新的文件并打开

2.O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错(返回-1)。

结构如下:

fd=open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);//fd为open返回的文件描述符,此时若已经存在file1,open返回-1

代码示例:

int main()
{
    int fd;
    fd = open("./file1",0 RDWRIO_CREATIO_EXCL,0600);
    if(fd == -1)
    {
        printf("file cunZai\n");
    }
    return 0;
}

//文件已经存在则会出错 返回值为-1 再针对-1做出验证

3.O_APPEND:每次写时都加到文件的尾端。

结构如下:

fd=open("./file1",O_RDWR|O_APPEND);//此时可将原file1文件里的信息保留后再从尾部写入

代码示例:

int main()、
{
    int fd;
    char *buf = "Hello Word";

    fd = open(" ./file1",0_RDWR|O_APPEND);
    printf("open susceess : fd = %d\n",fd);
    int n_write = write(fd,buf,strlen(buf));
    if(n_write != -1)
    {
        printf("write %d byte to fileln",n_write);
    }
    close(fd);
    return 0;
}

//原先在文件里写入123456 执行上述代码后会在原先里面的123456后输出Hello Word

4.O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。

结构如下:

fd=open("./file1",O_RDWR|O_TRUNC);//此时可将原file1文件里的信息先删除后写入
int main()、
{
    int fd;
    char *buf = "test";

    fd = open(" ./file1",0_RDWR|O_TRUNC);
    printf("open susceess : fd = %d\n",fd);
    int n_write = write(fd,buf,strlen(buf));
    if(n_write != -1)
    {
        printf("write %d byte to fileln",n_write);
    }
    close(fd);
    return 0;
}

//原先在文件里写入Hello Word,执行上述代码后文件会将原先里面的Hello Word替换成test

3.mode

mode是文件的创建模式,其执行功能有5种,分别是:

  • 可执行:0100
  • 可写:0200
  • 可读:0400
  • 可读、写:0600
  • 可读、可写、可执行:0700

读的符号是r,数值为4;写的符号是w,数值为2;执行的符号是x,数值为1。其中共有4位数,而mode的创建模式执行的功能取决于第2位的数值(几种数值本身的数或者和)。

对0600解析即:文件的所有者(用户)对文件file1的权限。

注:mode一定是在flags中使用了O CREAT标志,mode记录待创建的文件的访问权限。

文件描述符

执行一个程序时可能会打开很多文件,而对多个文件的操作需要进行区别,我们需要指定某个文件进行指定操作,这个时候就需要一个区分标志来辨别,即文件描述符。

当一个文件被打开时,系统会产生一个结构体来储存文件中的各种信息,此时文件描述符指向这些信息。同时open函数的返回值就是一个文件描述符,其返回值是一个较小的非负整数

代码展示

文件存在:

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

int main()
{
	int fd;//定义一个文件描述符
	
	fd = open("./file1",O_RDWR);//open函数的返回值给文件描述符
	printf("fd = %d\n",fd);//输出文件描述符的值
	return 0;
}

文件不存在:

创建(creat)

与open函数一样需包含以下三个头文件

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

creat的函数定义格式

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

示例:

fd = creat("/home/CLC/file1",S IRWXU);//指定路径创建文件 并赋予权限
fd = creat("./file1",S IRWXU);//当前路径创建文件 并赋予权限

与open函数一样,返回值也是文字描述符。返回值也是一个较小的非负整数。

函数定义的参数解读

1.pathname:指向文件的路径

2.mode

mode是文件的创建模式,这里与open函数的mode有区别,这里的创建模式为系统自带。

  • 可执行:S_IXUSR
  • 可写:S_IWUSRL
  • 可读:S_IRUSR
  • 可读、可写、可执行:S_IRWXU

代码展示

结合open函数:

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

int main()
{
	int fd;
	
	fd = open("./file1",O_RDWR);//此时文件已经不存在
	
	if(fd == -1)//文件不存在输出小于零的负数
	{
		printf("open file1 failed\n");//提示文件打开失败
		fd = open("./file1",O_RDWR|O_CREAT,0600);//创建一个可读可写可执行的文件
		if(fd > 0)//输出非负整数
		{
			printf("creat file1 success\n");//提示创建成功并打开
		}
	}
	return 0;
}

可见删除file1之后用该函数可以再次创建并打开。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Apache下分析ab性能测试结果

    Apache下分析ab性能测试结果

    本文详细讲解了Apache下分析ab性能测试结果,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • CentOS下宝塔部署Django项目的详细教程

    CentOS下宝塔部署Django项目的详细教程

    这篇文章主要介绍了CentOS下宝塔部署Django项目的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 解决Linux程序编译链接动态库版本的相关问题

    解决Linux程序编译链接动态库版本的相关问题

    这篇文章主要介绍了解决Linux程序编译链接动态库版本的相关问题,文中给出了详细的介绍和示例代码,相信对大家具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2017-01-01
  • linux 驱动编写之虚拟字符设备的编写实例详解

    linux 驱动编写之虚拟字符设备的编写实例详解

    这篇文章主要介绍了linux 驱动编写之虚拟字符设备的编写实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • linux 不删除文件,清空文件中内容的命令

    linux 不删除文件,清空文件中内容的命令

    下面小编就为 大家带来一篇linux 不删除文件,清空文件中内容的命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • centos7安装Redis6并设置密码实现方式

    centos7安装Redis6并设置密码实现方式

    文章介绍了如何从头安装和配置Redis,包括安装依赖、创建用户、配置文件修改、创建Systemd服务、防火墙配置、安全加固建议、常用管理命令等
    2025-12-12
  • ubuntu20.04虚拟机无法上网的问题及解决

    ubuntu20.04虚拟机无法上网的问题及解决

    这篇文章主要介绍了ubuntu20.04虚拟机无法上网的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Linux 中的防火墙 ufw 简介

    Linux 中的防火墙 ufw 简介

    ufw(简单防火墙Uncomplicated FireWall)真正地简化了 iptables,它从出现的这几年,已经成为 Ubuntu 和 Debian 等系统上的默认防火墙。这篇文章主要介绍了Linux 防火墙 ufw 简介,需要的朋友可以参考下
    2020-04-04
  • ubuntu vi编辑器修改文件的基本操作指令详解

    ubuntu vi编辑器修改文件的基本操作指令详解

    Vi编辑器是命令行文本编辑器,具有丰富的功能,但也可能对初学者有一定的学习曲线,以下是一些基本操作指令:打开文件、保存文件、退出Vi编辑器、保存并退出、插入文本、删除文本、复制和粘贴文本、移动光标、搜索文本、替换文本,Vi还有更多功能和快捷键,需要一些时间来熟悉
    2026-01-01
  • 谈一谈Linux系统重要的子目录问题

    谈一谈Linux系统重要的子目录问题

    这篇文章主要介绍了Linux系统重要的子目录问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-09-09

最新评论