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.rhkb.cn/news/108528.html

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

相关文章

Git 原理与使用

1.版本控制器 所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&#xff0c;同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑…

四、Kafka Broker

4.1.1 Zookeeper 存储的 Kafka 信息 4.1.2 Kafka Broker 总体工作流程 4.2 生产经验 - 节点的服役和退役 自己的理解&#xff1a;其实就是将kafka的分区&#xff0c;负载到集群中的各个节点上。 1、服役新节点 2、退役旧节点 4.3 kafka副本 1、副本的作用 2、Leader的选…

Java设计模式-状态模式

1.概述 定义&#xff1a; 对有状态的对象&#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状…

论文笔记: MOGRIFIER LSTM

2020 ICLR 修改传统LSTM 当前输入和隐藏状态充分交互&#xff0c;从而获得更佳的上下文相关表达 1 Mogrifier LSTM LSTM的输入X和隐藏状态H是完全独立的 机器学习笔记&#xff1a;GRU_gruc_UQI-LIUWJ的博客-CSDN博客这篇论文想探索&#xff0c;如果在输入LSTM之前&#xf…

前端需要理解的跨平台知识

混合开发是指使用多种开发模开发App的一种开发模式&#xff0c;涉及到两大类技术&#xff1a;原生 Native、Web H5。原生 Native 主要指 iOS&#xff08;Objective C&#xff09;、Android&#xff08;Java&#xff09;&#xff0c;原生开发效率较低&#xff0c;开发完成需要重…

Nginx的搭建与核心配置

Nginx的搭建与核心配置 1、IO模型1.1I/O 模型相关概念1.2网络I/O模型1.2.1阻塞型I/O模型1.2.2非阻塞型I/O模型1.2.3多路复用I/O型1.2.4信号驱动式I/O模型1.2.5异步I/O模型 2、Nginx概述2.1Nginx功能介绍2.2基础特性2.3Web服务相关的功能2.4Nginx进程结构2.4Nginx模块2.5Nginx三…

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …

Java多线程与并发编程

课程地址&#xff1a; https://www.itlaoqi.com/chapter.html?sid98&cid1425 源码文档&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WMvM3j6qhyjIeAT87kIcxg 提取码&#xff1a;5g56 Java多线程与并发编程 1-并发背后的故事什么是并发 2-你必须知道线程的概念程…

【RISC-V】RISC-V寄存器简介

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

第十三课 宾语从句

文章目录 前言一、宾语从句1、主语及物动词宾语从句2、主语双宾动词间接宾语直接宾语3、主语特定及物动词宾语从句&#xff08;作宾语&#xff09;宾补4、主语be某些形容词宾语从句5、动词不定式后面的宾语从句6、动名词后面的宾语从句7、介词后面的宾语从句9、间接引语 前言 一…

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录 题目&#xff1a;在数组中找第K大的元素解法1&#xff1a;维护长度为k的最小堆&#xff0c;遍历n-k个元素&#xff0c;逐一和堆顶值对比后&#xff0c;和堆顶交换&#xff0c;最后返回堆顶复杂度&#xff1a;时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…

Redis各类数据结构应用场景总结

Redis各类数据结构应用场景总结 引言String应用场景 List应用场景 Hash应用场景 Set应用场景 ZSet应用场景 小结 引言 实际面试过程中更多看重的是对Redis相关数据结构的活学活用&#xff0c;同时也可能会引申出Redis相关底层数据结构原理的实现&#xff0c;笔者最近面试过程中…

高效公文校对与文字处理:走进自然语言技术的新时代

在数字化时代的浪潮中&#xff0c;无论是政府材料、新闻稿、还是发言稿&#xff0c;高质量的文字内容成为了信息传递的核心。为了确保内容的专业性和准确性&#xff0c;公文校对和文字处理技术的进步成为了不可或缺的关键。本文将深入探讨自然语言处理技术如何为公文校对和文字…

DMK5框选变量之后不显示其他位置的此变量高亮

使用软件MDK5.3.8版本 如下在2的位置选择之后&#xff0c;其他同样的变量没有高亮&#xff0c;因为1的原因折叠了&#xff1b; 展开折叠之后就可以了

如何使用CSS实现一个水平居中和垂直居中的布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 水平居中布局⭐ 垂直居中布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣…

使用代理突破浏览器IP限制

一、实验目的: 主要时了解代理服务器的概念&#xff0c;同时如何突破浏览器IP限制 二、预备知识&#xff1a; 代理服务器英文全称是Proxy Server&#xff0c;其功能就是代理网络用户去取得网络信息。形象的说&#xff1a;它是网络信息的中转站&#xff0c;特别是它具有一个cac…

数据分析作业2

中国在 2020 年开展第七次全国人口普查&#xff0c;截止 2021 年 5 月 11 日普查结果公布&#xff0c;全国人口共1411778724人。单从数据表格看相关数据不够直观&#xff0c;需要进行数据可视化展示&#xff0c;方便查看数据结果。 任务一&#xff1a;链接 MySQL 数据库&#x…

Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解

概要 是否还在为网页测试而烦恼&#xff1f;是否还在为重复的点击、等待而劳累&#xff1f;试试强大的Selenium&#xff01;让你的网页自动化测试变得轻松有趣&#xff01; 一、Selenium库到底是什么&#xff1f; Selenium 是一个强大的自动化测试工具&#xff0c;它可以让你直…

前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax

第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象&#xff08;1&#xff09;XMLHttpRequest对象的函数&#xff08;2&#xff09;XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期&#xff08;1&#xff09;创建XMLHttpRequest对象&#xff…

Scikit-Learn中的特征选择和特征提取详解

概要 机器学习在现代技术中扮演着越来越重要的角色。不论是在商业界还是科学领域&#xff0c;机器学习都被广泛地应用。在机器学习的过程中&#xff0c;我们需要从原始数据中提取出有用的特征&#xff0c;以便训练出好的模型。但是&#xff0c;如何选择最佳的特征是一个关键问…