【Linux之IO系统编程学习】01.open函数使用 代码实现touch命令效果

news2024/11/18 0:21:28

 
【Linux之IO系统编程学习】

项目代码获取:https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)

01.open函数使用 & 代码实现touch命令

一、open函数(man手册)

最简单直接的方式就是查看man手册

man 2 open

在这里插入图片描述
这里可以看到使用Open函数需要包含三个头文件
(其实本代码中只包含 <fcntl.h> 头文件即可,另外两个应该是open函数族的其他函数需要包含)

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

二、open函数的使用

open 函数可以打开或者新建一个文件

我们使用下面这个形式的 open 函数

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

参数说明:
pathname: 要操作的路径和文件名(可能是新建、打开)
flag: 操作文件的方式,例如

项目Value
O_CRETE创建一个文件
O_RDWR读写
O_RDONLY只读
O_WRONLY只写
O_EXCL创建一个文件时,如果该文件存在,返回错误
O_TRUEC打开文件,会把文件内容都删除
O_APPEND以追加的方式打开文件

mode: 文件权限(例如:0777)

这些参数的说明可以在man手册里看到,如下图所示:
在这里插入图片描述
返回值:
翻译: 返回新的文件描述符,如果发生错误,则返回-1(在这种情况下,会适当设置errno)

man手册使劲往下翻

在这里插入图片描述

open函数使用举例:

open("a.txt", O_CREAT | O_RDWR, 0777);

表示新建一个a.txt文件,该文件可读可写,操作权限是777


三、使用open函数实现touch命令的效果

touch命令常见使用方法如下:

touch a.txt

touch后面跟上一个文件名,即可创建一个新的文件

下面是可以实现与 touch 同样效果的代码 touch.c 文件

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

int main(int argc, char *argv[])
{
    /*使用open函数代替touch新建文件*/
    int fd = open(argv[1], O_CREAT | O_RDWR, 0777);
    if(fd < 0){
        printf("create a file failed , fd = %d\n",fd);
    }else{
        printf("create a file success , fd = %d\n",fd);
    }
    /*关闭文件描述符*/
    close(fd);
    return 0;
}

重点说明:
1.使用argv参数传入要新建的文件名
2.判断open函数返回的文件描述符fd,如果fd大于0则成功
3.最后别忘了close()

gcc编译一下

gcc touch.c

运行测试一下

./a.out a.txt

在这里插入图片描述
如图所示,a.txt新建成功了,但是权限却不对,应该是 -rwxrwxrwx才对,最后面的其他用户权限少了个w写权限。

原因是Linux 是注重安全性的操作系统,而安全的基础在于对权限的设定,不仅所有已存在的文件和目录要设定必要的访问权限,创建新的文件和目录时,也要设定必要的初始权限。

查看Linux下默认的创建文件的初始权限掩码

umask

在这里插入图片描述
可以看到我的Linux掩码是0002
那么我创建的新文件的权限不会是我open函数最后给的mode参数0777
而是 mode 减去 umask,也就是0777-0002=0775
实际上他们是以八进制表示的,即
0777 —> 000 111 111 111
0002 —> 000 000 000 010
两者相减,我觉得也可以理解为异或操作,得到结果就是
000 111 111 101 —> 0775

·····················

话说回来,如何能使创建的文件权限就是0777呢,可以修改umask的值为0000就行了
执行 umask 0000 后再新建一个 b.txt
可以发现这次 b.txt 的权限就是0777了

在这里插入图片描述
但是 umask 0000 只能临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:

[root@localhost ~]# vim /etc/profile
...省略部分内容...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
    umask 002
    #如果UID大于199(普通用户),则使用此umask值
else
    umask 022
    #如果UID小于199(超级用户),则使用此umask值
fi
…省略部分内容…

这是一段 Shell 脚本程序,不懂也没关系,大家只需要知道,普通用户的 umask 由 if 语句的第一段定义,而超级用户 root 的 umask 值由 else 语句定义即可。 修改此文件,则 umask 值就会永久生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM处理器概论与组织

目录 1.ARM产品系列 2.体系结构 3.ARM指令集 定义&#xff1a; ARM的指令集&#xff1a; 4.编译原理 5.ARM存储模型 6.ARM的8种工作方式 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义 一个公司的名称、一类处理器的通称、一种技术&#xff0c;我们在这…

【中阳期货】人工智能AI与期货有什么 关系

人工智能&#xff08;AI&#xff09;和期货交易之间有许多相互影响的因素。AI可以帮助期货交易者在交易决策中更好地应对大量数据&#xff0c;加强交易系统预测能力&#xff0c;优化资产配置策略。以下是AI与期货交易的一些具体关系&#xff1a; 数据分析&#xff1a;AI有能力高…

python pickle反序列化分析

文章目录 前言Pickle的作用pickle反序列化pickletools和反序列化流程漏洞产生(__reduce__)R指令的绕过通过i和o指令触发 总结 前言 春秋杯中遇到了一道python题&#xff0c;使用的了numpy.loads()触发反序列化漏洞&#xff0c;百度学习了一下&#xff0c;发现numpy.load()会先…

【mysqlbinlog 恢复数据】

不小心把数据删掉了 首先要拿到binlog文件 命令行执行 /usr/local/mysql/bin/mysqlbinlog --base64-outputdecode-rows --start-datetime"2023-05-19 09:01:32" --stop-datetime"2023-05-19 09:01:35" -v /Users/zylong/Downloads/mysql-bin.003178 --re…

动态规划-状态机模型

大盗阿福 题目 链接&#xff1a;https://www.acwing.com/problem/content/1051/ 阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N N N 家店铺&#xff0c;每家店中都有一些现金。 阿福事先调查得知&#xff0c;只…

chatgpt赋能Python-python3_9怎么下载

Python 3.9: 从哪里下载以及如何安装 Python是一种高级编程语言&#xff0c;被广泛使用于数据科学、人工智能、Web开发等领域。Python的最新版本是Python 3.9&#xff0c;它带来了一些新的特性和改进。对于那些希望尝试Python 3.9的人来说&#xff0c;了解如何下载和安装是很重…

chatgpt赋能Python-python3下载文件

Python3下载文件&#xff1a;从入门到实践 在Python编程语言中&#xff0c;下载文件是一个常见的需求。无论你是想下载图片、视频、文本文件或者其他类型的文件&#xff0c;Python都提供了强大的工具来实现这一操作。在本文中&#xff0c;我们将深入探讨如何使用Python3来下载…

pwn入门(二)环境搭建

一.前言 在上一篇中介绍了一下pwn和一些前置知识&#xff0c;但是呢以我的感觉&#xff0c;我觉得ctf还是得多做题的&#xff0c;所以呢&#xff0c;我选择边做边学&#xff0c;我觉得这样可以快速熟悉pwn还可以有成就感。 这一篇就是搭建环境的分享&#xff0c;同时还有大佬告…

【问题记录】USB monitor抓包工具显示音频数据CRC error

一&#xff0c;简介 在进行UAC2.0调试的过程中&#xff0c;使用USB monitor抓包工具抓取音频流数据出现数据错乱现象&#xff0c;本文对该问题进行分析记录。 二&#xff0c;问题记录及分析过程 2.1 先看下正常的抓包数据是什么样子&#xff1a; 从上图可以看出&#xff0c;…

VMware ESXi 6.0 多网卡接入 多网段绑定 虚机接入不同网段

网卡要与对应网段的网络联通。不同的网卡接入不同网段的网络。要为vmware esxi 6 的多个虚机配置不同网段的ip地址&#xff0c;首先选择主机对应的网口分别插上处于在不同网段的网线。 配置管理网络 多个网口接入&#xff0c;只可以配置一个管理网络&#xff0c;就是只有一个网…

基于XGBOOST模型预测货物运输耗时 - Part 2 通过方差分析了解文本型变量与数值型目标变量的关系

在分析数据之前&#xff0c;我们需要剔除异常值的影响&#xff0c;也就是在某个分组情况下&#xff0c;标准差过大&#xff08;标准差越大&#xff0c;证明情况越不稳定&#xff09;&#xff0c;如果标准差比较小&#xff0c;就算是最小值和最大值差的比较大&#xff0c;我也认…

chatgpt赋能Python-python3下载numpy包

Python3 下载numpy包教程 如果你是一名Python开发者&#xff0c;那你一定不会陌生于NumPy。NumPy是Python中的一个科学计算库&#xff0c;它主要用来处理数组和矩阵运算。本文将会教你如何在Python3中下载NumPy库。 步骤一&#xff1a;确认你已经安装了pip 如果你使用的是Py…

chatgpt赋能Python-python3__2__3

Python323 - 一个强大的编程工具 介绍 Python323 是一种高级编程语言&#xff0c;最初由 Guido van Rossum 在 1989 年创建。Python 3.2.3 是 Python 3 的其中一个发行版&#xff0c;它拥有很多新特性和改进。Python323 可以运行在多种操作系统上&#xff0c;包括 Windows、L…

redis哨兵监控leader和master选举原理

当一个主从配置中的master失效后&#xff0c;sentinel可以选举出一个新的master,用于自动接替原master的工作&#xff0c;主从配置中的其他redis服务器自动指向新的master同步数据。是如何具体做的呢&#xff0c;主要有以下4步。 一般建议sentinel 采取奇数台. 1.SDown 主观下…

Day43【动态规划】1049.最后一块石头的重量 II、494.目标和、474.一和零

1049.最后一块石头的重量 II 力扣题目链接/文章讲解 视频讲解 还是需要转化为 0-1 背包问题&#xff1a;物品装入背包&#xff0c;求装入的最大价值&#xff08;每个物品至多装入一次&#xff09; 要把01背包问题套到本题上来&#xff0c;需要确定 背包容量物品价值物品重…

分布式消息中间件RocketMQ的应用

RocketMQ 应用 所有代码同步至GitCode&#xff1a;https://gitcode.net/ruozhuliufeng/test-rocketmq.git 普通消息 消息发送分类 ​ Producer对于消息的发送方式也有多种选择&#xff0c;不同的方式会产生不同的系统效果。 同步发送消息 ​ 同步发送消息是指&#xff0c;P…

Win11或Win10重置电脑提示“找不到恢复环境”

想要重置电脑缺提示找不到恢复环境 查看是否开启功能 按住“winx”选A管理员运行终端&#xff0c;输入reagentc /info。 如果信息结果如下&#xff1a; Windows RE 状态: DisabledWindows RE 位置:引导配置数据(BCD)标识符: cedd8faa-707a-11ed-ad72-a8056da9f4d6…

头歌计算机组成原理实验—运算器设计(3)第3关:4位快速加法器设计

第3关&#xff1a;4位快速加法器设计 实验目的 帮助学生掌握快速加法器中先行进位的原理&#xff0c;能利用相关知识设计4位先行进位电路&#xff0c;并利用设计的4位先行进位电路构造4位快速加法器&#xff0c;能分析对应电路的时间延迟。 视频讲解 实验内容 利用前一步设…

Learning C++ No.23【红黑树封装set和map】

引言 北京时间&#xff1a;2023/5/17/22:19&#xff0c;不知道是以前学的不够扎实&#xff0c;还是很久没有学习相关知识&#xff0c;对有的知识可以说是遗忘了许多&#xff0c;以该篇博客有关知识为例&#xff0c;我发现我对迭代器和模板的有关知识的理解还不够透彻&#xff…

音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境

安装vs2019qt,并且在windows环境上安装ffmpeg&#xff0c;尝试使用qtcdb进行调试&#xff0c;尝试使用vs2019加载qt的程序。 安装VS20195.12.2qt环境&#xff0c;并进行测试。 1&#xff1a;安装Visual Studio 2019, a.从官网下载&#xff0c;或者vs2019社区版本下载地址 ht…