Linux(基础IO、文件权限、Makefile)

目录

1、man 手册

1.1 汉化

1.2 具体使用

2、文件权限

2.1 权限理解

2.2 文件详细信息查询

2.3 权限更改

3、常用函数接口

3.1 open

3.2 read

3.3 write

3.4 close

3.5 函数使用示例

4、make与Makefile

4.1 make 与 Makefile区别

4.2 Makefile的编写

5、vim简单操作


1、man 手册

1.1 汉化

安装中文包

sudo apt-get update
sudo apt-get install manpages-zh

1.2 具体使用

使用三种方式查询open接口的详细信息

//man -L zh_CN open
man 1 open
man 2 open
man 3 open

2、文件权限

2.1 权限理解

在 Ubuntu(以及其他类 UNIX 操作系统)中,文件权限用于控制谁可以对文件进行哪些操作。文件权限在权限位组合中表示为一组三位权限字符串。每个权限字符串表示了文件的所有者、组和其他用户所具有的权限。 Ubuntu 文件权限的详细说明:

一个权限字符串由九个字符组成,这九个字符可以分成三组,每组三个字符:

  • 第一组:文件类型和所有者权限
  • 第二组:组权限
  • 第三组:其他用户权限

每组中的三个字符分别表示读取(r)、写入(w)和执行(x)权限。如果某个权限位被授予,相应的字符为相应的字母,如果未授予,则为减号(-)。

以下是一个权限字符串的示例:-rwxr--r--

这个权限字符串表示:

  • 文件类型:普通文件(减号表示)
  • 所有者权限:读、写、执行
  • 组权限:读
  • 其他用户权限:读

2.2 文件详细信息查询

可以用 ll 命令查看当前文件夹下文件详细信息

 或者查看指定文件

zsd@Ubuntu:~/study/linuxStudy$  ls -l test.c
-rw-rw-r-- 1 zsd zsd 0  8月 27 15:34 test.c

在上面的输出中,-rw-r--r-- 就是文件的权限字符串。第一个字符 - 表示文件类型(普通文件),d 表示隐藏文件,接下来的三个字符是所有者权限,再后面的三个字符是组权限,最后的三个字符是其他用户权限。

2.3 权限更改

要更改文件权限,可以使用 chmod 命令。例如,要将文件 "test.c" 的所有者权限设置为读、写、执行,可以执行以下命令:

chmod 700 test.c

这会将权限字符串修改为 -rwx------,表示所有者拥有全部权限,其他用户没有任何权限。

3、常用函数接口

3.1 open

open 函数是一个系统调用,用于打开一个文件或者创建一个新文件,并返回一个文件描述符(file descriptor),以便后续对文件的读写操作。它是在 <fcntl.h> 头文件中声明的,其函数原型如下:

#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);

① open 函数的参数和作用:

  • pathname(文件路径):这是一个字符串,表示要打开或创建的文件的路径。可以是相对路径或绝对路径。

  • flags(标志位):这是一个整数,用于指定打开文件的方式和选项。常见的标志位包括:

    • O_RDONLY:只读打开。
    • O_WRONLY:只写打开。
    • O_RDWR:读写打开。
    • O_CREAT:如果文件不存在,创建文件。
    • O_TRUNC:如果文件存在,截断文件(将文件大小置为0)。
    • O_APPEND:在文件末尾追加写入。

    这些标志位可以通过按位或(|)组合使用,以满足特定的需求。例如,O_RDONLY | O_CREAT 表示以只读方式打开文件,如果文件不存在则创建。

  • mode(文件权限):这是一个整数,仅在创建文件时使用。它指定了新创建文件的权限(文件所有者、组和其他用户的读写执行权限)。通常使用八进制表示,如 0644 表示所有者可读写,其他用户只读。

②函数返回值:

open 函数的返回值是一个整数,表示文件描述符。如果成功打开或创建文件,返回的文件描述符是一个非负整数。如果出现错误,返回值为 -1,并可以使用 errno 来获取具体的错误代码。

3.2 read

read 函数是一个系统调用,用于从文件描述符(file descriptor)中读取数据。它是在 <unistd.h> 头文件中声明的,其函数原型如下:

#include <unistd.h> 
ssize_t read(int fd, void *buf, size_t count);

①read 函数的参数和作用:

  • fd(文件描述符):这是一个整数值,表示要从哪个文件描述符读取数据。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,使用了 open 函数来打开文件,并将返回的文件描述符传递给了 read 函数。

  • buf(缓冲区):这是一个指向存储读取数据的内存缓冲区的指针。read 函数会将读取的数据存储到这个缓冲区中。

  • count(读取字节数):这是要读取的最大字节数。read 函数会尝试从文件中读取最多 count 字节的数据。

②函数返回值:

read 函数的返回值是一个 ssize_t 类型的整数,表示实际读取的字节数。返回值可以是以下几种情况之一:

  • 如果返回值为正数:表示成功读取了指定数量的字节。
  • 如果返回值为 0:表示已经到达文件末尾(End of File,EOF)。
  • 如果返回值为 -1:表示出现了错误。可以通过检查 errno 来获取具体的错误代码。

3.3 write

write 函数是一个系统调用,用于向文件描述符(file descriptor)写入数据。它是在 <unistd.h> 头文件中声明的,其函数原型如下:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

①write 函数的参数和作用:

  • fd(文件描述符):这是一个整数值,表示要向哪个文件描述符写入数据。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,你使用了 open 函数来打开文件,并将返回的文件描述符传递给了 write 函数。

  • buf(缓冲区):这是一个指向包含要写入数据的内存缓冲区的指针。write 函数会将缓冲区中的数据写入到文件中。

  • count(写入字节数):这是要写入的字节数。write 函数会尝试将缓冲区中的前 count 字节的数据写入到文件中。

②函数返回值:

write 函数的返回值是一个 ssize_t 类型的整数,表示实际写入的字节数。返回值可以是以下几种情况之一:

  • 如果返回值为非负数:表示成功写入了指定数量的字节。
  • 如果返回值为 -1:表示出现了错误。可以通过检查 errno 来获取具体的错误代码。

3.4 close

close 函数是一个系统调用,用于关闭文件描述符(file descriptor)。它是在 <unistd.h> 头文件中声明的,其函数原型如下: 

#include <unistd.h>
int close(int fd);

①close 函数的解析:

  • fd(文件描述符):这是一个整数值,表示要关闭的文件描述符。文件描述符是一个用于标识打开的文件、套接字等的整数值。在代码中,你可能使用了 open 函数来打开文件,并将返回的文件描述符传递给了 close 函数。

②函数返回值:

close 函数的返回值是一个整数。如果关闭文件成功,返回值为 0。如果出现错误,返回值为 -1,并可以通过检查 errno 来获取具体的错误代码。

3.5 函数使用示例

#include <fcntl.h>   // 包含文件操作相关的头文件
#include <unistd.h>  // 包含系统调用相关的头文件
#include <stdio.h>   // 包含标准输入输出库,用于使用 perror 函数int main() {// 打开源文件,只读方式int src_fd = open("source.txt", O_RDONLY);if (src_fd == -1) {perror("Error opening source file");return 1;}// 打开目标文件,写入方式(如果不存在则创建)int dest_fd = open("destination.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (dest_fd == -1) {perror("Error opening destination file");close(src_fd);  // 关闭源文件return 1;}// 读取源文件数据并写入目标文件char buffer[1024];ssize_t bytes_read;while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0) {ssize_t bytes_written = write(dest_fd, buffer, bytes_read);if (bytes_written == -1) {perror("Error writing to destination file");close(src_fd);   // 关闭源文件close(dest_fd);  // 关闭目标文件return 1;}}// 检查读取过程中是否出错if (bytes_read == -1) {perror("Error reading from source file");close(src_fd);   // 关闭源文件close(dest_fd);  // 关闭目标文件return 1;}// 关闭文件if (close(src_fd) == -1) {perror("Error closing source file");return 1;}if (close(dest_fd) == -1) {perror("Error closing destination file");return 1;}printf("File copy successful.\n");return 0;
}

4、make与Makefile

4.1 make 与 Makefile区别

make make 是一个命令行工具,用于自动化构建软件项目。它根据一组规则和依赖关系,检查源代码文件的最新修改日期,并确定哪些文件需要重新编译。make 在 Linux 和类 UNIX 系统上广泛使用,以减少手动编译的工作量。

Makefile Makefile 是一个文本文件,其中包含了用于构建软件项目的规则、依赖关系和命令。它告诉 make 工具如何编译和链接源代码文件,以及在构建过程中需要执行哪些操作。Makefile 通常包括目标(target)、依赖关系(dependencies)和要执行的命令。

4.2 Makefile的编写

# 编译器
# CC = g++
CC = gcc# 编译选项
# CFLAGS = -Wall -std=c++11
# CFLAGS = -Wall -std=c++11 -g
# CFLAGS = -Wall -std=c++11 -static
CFLAGS = -Wall# 目标文件名
TARGET = myprogram# 所有的源代码文件
SOURCES = main.c utils.c mytest.c# 生成目标文件的中间文件
OBJECTS = $(SOURCES:.c=.o)# 默认目标
all: $(TARGET)# 生成目标文件
$(TARGET): $(OBJECTS)$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)# 编译每个源文件到目标文件
%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# 调试目标
# debug: $(TARGET)# gdb ./$(TARGET)# 清理生成的文件
clean:rm -f $(OBJECTS) $(TARGET)

5、vim简单操作

输入:help查看帮助,按下Ctrl + w 然后按下 q 退出帮助

  1. 启动 Vim: 在终端中输入 vim 命令,后跟文件名,即可启动 Vim 并打开指定文件:

  2. 模态编辑: Vim 有多种模式,其中两个主要模式是:

    • 正常模式(Normal Mode):用于导航、删除、复制等操作。
    • 插入模式(Insert Mode):用于输入文本。
  3. 切换模式

    • 进入正常模式:按下 Esc 键。
    • 进入插入模式:在正常模式下按下 i 键(在光标前插入)、a 键(在光标后插入)或其他命令(如 oO)。
  4. 保存和退出

    • 保存文件:在正常模式下按下 : 键,然后输入 w 并按下 Enter 键。
    • 保存并退出:在正常模式下按下 : 键,然后输入 wq 并按下 Enter 键。
    • 退出不保存:在正常模式下按下 : 键,然后输入 q! 并按下 Enter 键。
  5. 基本移动

    • 上移:k
    • 下移:j
    • 左移:h
    • 右移:l
  6. 删除和复制

    • 删除字符:在正常模式下按下 x 键。
    • 复制行:在正常模式下按下 yy
  7. 撤销和重做

    • 撤销:在正常模式下按下 u 键。
    • 重做:在正常模式下按下 Ctrl + r 键。
  8. 查找和替换

    • 查找:在正常模式下按下 / 键,然后输入要查找的内容并按下 Enter 键。
    • 替换:在正常模式下按下 : 键,然后输入 %s/old/new/g 进行全局替换。

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

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

相关文章

阿里云服务器搭建FRP实现内网穿透-P2P

前言 在了解frp - p2p之前&#xff0c;请先了解阿里云服务器搭建FRP实现内网穿透-转发: 文章地址 1、什么是frp - p2p frp&#xff08;Fast Reverse Proxy&#xff09;是一个开源的反向代理工具&#xff0c;它提供了多种功能&#xff0c;包括端口映射、流量转发和内网穿透等。…

归并排序之从微观看递归

前言 这次&#xff0c;并不是具体讨论归并排序算法&#xff0c;而是利用归并排序算法&#xff0c;探讨一下递归。归并排序的特点在于连续使用了两次递归调用&#xff0c;这次我们将从微观上观察递归全过程&#xff0c;从本质上理解递归&#xff0c;如果能看完&#xff0c;你一…

Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径

目录 802.11MAC帧基本概念 802.11帧结构 802.11MAC帧的分类 管理帧 控制帧 数据帧 STA接入无线网络流程 信号扫描—管理帧 链路认证—管理帧 用户关联—管理帧 用户上线 不同802.11帧的转发路径 802.11MAC帧基本概念 802.11协议在802家族中的角色位置 其中802.3标…

搭建开发环境-Windows

写C# 的请出去。 然后&#xff0c;Windows 是最好的Linux发行版。搭建开发环境-WSLUbuntu

【Git Bash】简明从零教学

目录 Git 的作用官网介绍简明概要 Git 下载链接Git 的初始配置配置用户初始化本地库 Git 状态查询Git 工作机制本地工作机制远端工作机制 Git 的本地管理操作add 将修改添加至暂存区commit 将暂存区提交至本地仓库日志查询版本穿梭 Git 分支查看分支创建与切换分支跨分支修改与…

Redisi缓存的击穿、穿透、雪崩,介绍一下

缓存击穿 缓存击穿是指在高并发场景下&#xff0c;缓存中的某个 key 失效&#xff0c;此时大量请求同时涌入数据库查询该 key 的数据&#xff0c;导致数据库瞬间压力过大&#xff0c;甚至宕机。缓存击穿的最佳解决方案是使用互斥锁&#xff0c;令只有一个线程可以从数据库中查…

leetcode500. 键盘行

【简单题】 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成。第三行由字符 "zxcvbnm&…

React 面试题集锦

目录 如果想要在组件第一次加载后获取该组件的dom元素&#xff0c;应当在以下哪个生命周期中进行 React支持的键盘事件是 使用严格模式&#xff08;Strict Mode&#xff09;优点 React 动态引入组件 当使用ReactDOM.unmountComponentAtNode从DOM中卸载组件时 说一下useS…

Nacos集群

需要与Nginx配合。 这是使用三个Nacos来搭建集群。 创建mysql数据库nacos。 配置Nacos 进入nacos的conf目录&#xff0c;修改配置文件cluster.conf.example&#xff0c;重命名为cluster.conf。 在cluster.conf文件的最后加上&#xff1a; #it is ip #example 127.0.0.1:8…

通俗理解DDPM到Stable Diffusion原理

代码1&#xff1a;stabel diffusion 代码库代码2&#xff1a;diffusers 代码库论文&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models模型权重&#xff1a;runwayml/stable-diffusion-v1-5 文章目录 1. DDPM的通俗理解1.1 DDPM的目的1.2 扩散过程1.3 …

测试框架pytest教程(6)钩子函数hook开发pytest插件

pytest hook 函数也叫钩子函数&#xff0c;pytest 提供了大量的钩子函数&#xff0c;可以在用例的不同生命周期自动调用。 比如&#xff0c;在测试用例收集阶段&#xff0c;可利用 hook 函数修改测试用例名称的编码。 pytest的hook是基于Python的插件系统实现的&#xff0c;使…

Tokenview再度升级:全新Web3开发者APIs数据服务体验!

Tokenview发布全新版本的区块链APIs和数据服务平台&#xff0c;为开发者打造更强大、更便捷的开发体验&#xff01; 此次升级&#xff0c;我们整合了开发者使用习惯以及Tokenview产品优势。我们深知对于开发者来说&#xff0c;时间是非常宝贵的&#xff0c;因此我们努力提供一…

蚂蚁 SOFAServerless 微服务新架构的探索与实践

赵真灵&#xff08;有济&#xff09; 蚂蚁集团技术专家 Serverless 和微服务领域专家曾负责基于 K8s Deployment 的应用发布运维平台建设、K8s 集群的 Node/pod 多级弹性伸缩与产品建设。当前主要负责应用架构演进和 Serverless 相关工作。同时也是 SOFAArk 社区的开发和维护者…

基于上下文管理器context的timer

文章目录 1. 用 上下文管理器实现计时2. 打印结果 1. 用 上下文管理器实现计时 #!/usr/bin/env python # -*- coding:utf-8 -*- # FileName :MyTimer.py # Time :2023/8/27 13:57 # Author :Jason Zhang import time import mathclass Timer:# 定义开始时间def __ent…

我的数据上传类操作(以webDAV为例)

在登录处进行初始化&#xff1a; 1.读取配置 GModel.ServerSetin JsonToIni.GetClass<ServerSet>(ConfigFiles.ConfigFile);if (!string.IsNullOrWhiteSpace(GModel.ServerSetin.FTPUser)){OPCommon.NetControls.NetworkShareConnect.connectToShare(GModel.ServerSeti…

两款开箱即用的Live2d

目录 背景第一款&#xff1a;开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款&#xff1a;换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了&#xff0c;记得那是在2…

Element-Ui Select下拉框无限滚动调分页接口(自定义指令)

需求: 想要一次加载10条数据&#xff0c;滚动条加载到底部触发下一个十条数据&#xff0c;无限循环直到无数据 一、首先在src下创建一个js文件&#xff0c;完成自定义指令的编写 directives.js import Vue from vueexport default () > {Vue.directive(selectScroll, {bind…

私有IP地址定义、私有IP地址范围(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)

文章目录 私有IP地址定义和范围私有IP地址的使用将局域网中的ip地址设为私有IP地址范围之外的地址&#xff0c;会有什么后果&#xff1f;参考资料 私有IP地址 私有IP地址是在互联网上不被路由的IP地址&#xff0c;专门为组织内部网络&#xff08;如企业内部、学校等&#xff0…

【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?

在3dMax中如何把三维物体转化为由样条线构成的对象&#xff1f;通常这样的场景会出现在科研绘图或一些艺术创作当中&#xff0c;下面给大家详细讲解一种3dmax三维物体转样条线的方法。 第一部分&#xff1a;用粒子填充3D对象&#xff1a; 1.创建一个三维对象&#xff08;本例…

【java】one record is expected, but the query result is multiple records

报错&#xff1a;one record is expected, but the query result is multiple records&#xff0c;意思是&#xff1a;需要一条记录&#xff0c;但查询结果是多条记录。这个问题很常见&#xff0c;但是进过排查&#xff0c;是用户表【手机号唯一原则】查询时候发现是时候多出来…