linux open函数用法详解 如何打开或创建文件并设置权限

 更新时间:2026年08月25日 09:32:05   作者:昒曦  
还在为Linux文件操作发愁?本文深入讲解open()和close()函数的用法,包括文件打开标志如O_CREAT、O_EXCL,以及mode参数与umask掩码如何共同决定文件权限,帮你轻松掌握文件描述符和权限设置

open函数

函数介绍

在Linux中open()函数用来打开或创建一个文件,当打开文件失败时返回值为-1;成功则返回作为文件描述符(一个非负的数值)。

头文件及函数原型

#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);//打开或创建文件,并给文件赋权限 

参数

open()函数参数
pathname打开的文件名或路径,路径用绝对路径
flag      标志作用
O_RDONLY只读方式打开文件
O_WDONLY只写方式打开文件
O_RDWR读写方式打开文件
O _ NONBLOCK
非阻塞方式打开文件
O_CREAT文件不存在就创建
O_EXCL与O_CREAT一起使用,判断文件是否存在。文件存在返回错误信息,
O_NOCTTY
不让pathname所指向的终端成为控制终端
O_TRUNC文件清0,若文件存在则文件内的内容将被清空
O_APPEND添加方式打开文件,打开文件时,文件指针指向文件末尾,将写入数据添加到文末
O _ SYNC
同步方式写入文件
O_DSYNC
提供同步的I/O数据完整性
O _ ASYNC
I/O操作可行,产生信号通知进程
O _ DIRECT
无缓冲输入输出
O _ DIRECTORY
若不是目录,则失败
modeS_IRUSER | S_IWUSR

设置文件所有者可读可写(即0600)

第一位数字0代表特殊权限(suid:4、sgid:2、sbit:1),不是八进制的意思。一般将其设置为0,即系统默认。

一组宏定义:S_I(R/WX)(USR/GRP/OTH)

R(4):读        W(2):写        X(1):可执行

USR:文件所有者

GRP:文件所属组

OTH:其他所有者

在给文件赋权限时,在open函数中给的权限并不是文件真正的权限,还要与文件本地的掩码按位与之后的结果才是其真正的权限。通过umask可以获取本地的掩码或者修改本地的掩码。

其过程如下图所示。

修改本地俺码

umask 0023     //把本地的掩码修改成0023
/****************
 *其中后面三个数字分别代表文件的所有者、所属组、其他用户的权限;
 *通过设置数字表示取消该用户对文件的权限;上述的2和3分别表示取消了
 *用户所属组的写权限和其他用户对该文件写和执行权限。
*****************/

文件实际权限求法

close函数

函数介绍

close()顾名思义就是关闭文件,一般与open()函数一起使用。

每当打开、读写文件完成后都要使用close函数关闭文件。

头文件函数原型

#include <unistd.h>
int close(int fd); //参数fd为文件描述符

open()、close()函数使用

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>    //前三个是open函数头文件
#include <unistd.h>    //close头文件
#include <stdio.h>    //perror头文件
#include <stdlib.h>    //exit头文件

int main(){
        int fd;
        //定义一个文件描述符变量
        //打开文件
        //fd = open("hello.c",O_RDWR);        //打开文件,若该文件没有则报错
        //fd = open("hello.c",O_RDWR|O_CREAT,0777);    //打开文件,没有则创建并给文件赋权限
        //fd = open("hello.c",O_RDWR |O_CREAT | O_EXCL,0777 );
        //参数O_EXCL用来判断文件是否存在,其必须与O_CREAT一起使用才能判断文件是否村在
        //O_TRUNC将文件截断为零,即清空文件内容
        fd = open("hello.c",O_RDWR |O_CREAT | O_TRUNC,0777 );
        //打开文件失败
        if (fd== -1){
           perror("Open file error");
           //通过errno函数的返回值,perror把提示信息和错误信息一起输出
           exit(1);
        }
        printf("Create %d success!\n",fd);
        close(fd);    //关闭文件,fd为open函数返回的文件描述符
}

总结

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

相关文章

  • 简单谈谈apache与nginx

    简单谈谈apache与nginx

    简单的说apache是计算密集型,nginx是io密集型,各有优势,不存在谁取代谁
    2014-12-12
  • linux下如何查看java进程内存占用情况

    linux下如何查看java进程内存占用情况

    这篇文章主要介绍了linux下如何查看java进程内存占用情况问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Linux服务器配置ip白名单防止远程登录以及端口暴露的问题

    Linux服务器配置ip白名单防止远程登录以及端口暴露的问题

    今天小编就为大家分享一篇Linux服务器配置ip白名单防止远程登录以及端口暴露的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Linux服务器配置多个svn仓库流程详解

    Linux服务器配置多个svn仓库流程详解

    这篇文章主要介绍了linux服务器配置多个svn仓库流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Linux通过密钥认证实现SSH无密码登录

    Linux通过密钥认证实现SSH无密码登录

    在服务器管理中,使用 SSH 密钥认证可以有效提升登录安全性,本文主要介绍了Linux通过密钥认证实现SSH无密码登录,具有一定的参考价值,感兴趣的可以了解一下
    2025-05-05
  • Linux系统非正常关机导致磁盘异常的问题及解决

    Linux系统非正常关机导致磁盘异常的问题及解决

    文章介绍了在VMware ESXi虚拟化环境中,由于断电导致的Linux系统非正常关机和磁盘异常问题及其解决方案,主要问题包括文件系统损坏和报错信息,解决方案涉及检查和修复`/etc/fstab`文件中的语法错误,并使用`dmsetup`命令恢复设备映射
    2025-11-11
  • Centos安装MYSQL8.X的教程

    Centos安装MYSQL8.X的教程

    这篇文章主要介绍了Centos安装MYSQL8.X的教程,本文以CentOS版本为7.6,安装的MySQL版本为8.0.17,感兴趣的朋友跟随小编一起看看吧
    2019-10-10
  • Ubuntu 18.04 Server 设置静态IP 的方法

    Ubuntu 18.04 Server 设置静态IP 的方法

    Netplan是Ubuntu 17.10中引入的一种新的命令行网络配置实用程序,用于在Ubuntu系统中轻松管理和配置网络设置。这篇文章主要介绍了Ubuntu 18.04 Server 设置静态IP 的方法,需要的朋友可以参考下
    2018-11-11
  • Linux sudo 漏洞可能导致未经授权的特权访问

    Linux sudo 漏洞可能导致未经授权的特权访问

    sudo 命令中最近发现了一个严重漏洞,如果被利用,普通用户可以 root 身份运行命令,在 Linux 中利用新发现的 sudo 漏洞可以使某些用户以 root 身份运行命令,感兴趣的朋友跟随小编一起看看吧
    2019-10-10
  • apache-zookeeper-3.7.1 安装部署教程

    apache-zookeeper-3.7.1 安装部署教程

    这篇文章主要介绍了apache-zookeeper-3.7.1 安装部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02

最新评论