Linux学习笔记8

news2024/11/16 19:20:05

介绍man命令

在Linux中,man命令用于查看系统手册页(manual pages)。系统手册页是关于各种Linux命令、函数库以及系统调用的详尽文档,能够提供关于命令的使用方法、参数说明、示例以及其他相关信息

可以利用man xxx的命令去查找某个函数某个命令的用法

inode

每一个文件都有一个索引节点inode,inode 是由文件系统提供的唯一数值编址,这个数
值称为inode 编号。索引节点是唯一的,同一个系统下,每一个索引节点对应一个文件(目录
也可以当做文件),可以把inode理解成身份证号。

可以用“ls -i”去查看索引节点

man去查询测试mkdir文件

先在终端输入命令“man 2 mkdir”,之后下拉找到

再往下的SEE ALSO会介绍相关的函数

测试代码

#include<stdio.h>//mkdir函数头文件
#include<sys/stat.h>
#include<sys/types.h>
int main(int argc,char *argv[]){
int ret;
//检测参数
if(argc <2)
{printf("\n Please input file path\n");return 1;}
//使用mkdir函数新建目录
ret = mkdir(argv[1],0777);
if(ret<0)
{printf("mkdir %s failed!\n",argv[1]);return 1;}
printf("mkdir %s suceces!\n",argv[1]);
return 0;}

代码分析:

main里的参数: argc 是命令行参数的数量,argv 是一个指向参数字符串数组的指针

if语句检查命令行参数的数量,如果少于 2 个(即没有输入文件路径),则打印提示信息并返回 1,表示程序运行出错

注释:命令行参数的数量是指在运行程序时通过命令行输入的参数的个数,其中第一个参数通常是程序的名称(例如 ./myprogram),后续的参数可以是用户自定义的,所以按理我们应该会输入文件路径,加上原有的文件名称,应该是有两个命令行参数

argv[1] 是第二个命令行参数,即用户输入的文件路径

之后可以用U盘拷贝到开发板的方法去运行这个测试程序

使用man 学习link 函数

在Linux系统中,硬链接是一种特殊的文件链接方式,它允许一个文件拥有多个不同的文件名,但实际上它们都指向同一个inode,比如目录1和2的索引节点是一样的,这两个其实都是指向同一个文件,就像一个人有学号和名字一样,指的都是同一个人,这种情况就是属于linux 文件中的硬链接。

和硬链接对应的是软链接,也可以叫符号链接或者symlinks,软连接不是文件系统的文件
名和inode 的映射,而是一种指针。换句话说,符号链接就像是一个快捷方式,它指向另一个文件或目录

link函数:

使用命令“man 2 link”,之后有

int link(const char *oldpath, const char *newpath);
参数*oldpath:已有的文件路径。
参数*newpath:新建的硬链接文件路径。

#include<studio.h>
#include<unisted.h>
int main(int argc,char *argv[]){
int ret;
if(argc <3)
{
printf("\nPlease input file path\n");
return 1;
}
//测试1ink函数
ret = link(argv[1l,argv[2]);
if(ret){
printf("link failed");
return 1;}
printf("link %s to %s success!\n",argv[1],argv[2]);
return 0;}

编译程序为可执行程序后,将文件拷至U盘,后在开发板上运行,则可见

之后用ls -i可见linktest和linktest.c文件的inode是一样的

Linux里的进程

大家几乎都是先学单片机再来学Linux的,在单片机里,我们知道其实主要是对一些寄存器进行控制,比如在某个寄存器里写入1就可以实现中断等等。而Linux是一种操作系统,和裸机对比起来,操作系统有更多的软件资源,可以调用函数去实现多任务运行,而不是像单片机一样去用中断实现一些操作。

先理解程序,何为程序,就是我们上面的那些例程,如果程序比较大,就可以称为应用

很多人不是很清楚线程,进程和程序的区别:

进程是正在执行的程序,可以把线程理解成轻量级的进程(记住“轻量级”这个特点),而且进程是分配资源的最小单位,属于同一个进程的线程由于没有被单独分配资源,所以它们都是共享进程的资源的(如地址空间等),但是每个线程会拥有独属于自己的栈

在Linux系统里可以通过“top”命令去查看在运行的线程(类似于Windows的任务管理器)

进程id

在n时刻,每个进程都有一个唯一的id,比如进程A在n时刻的id是100(但是假如在n+s时刻,可能会有进程B的进程也是100的情况),进程的id在固定的时刻是唯一的。

进程ID通常是一个正整数值,范围可以根据操作系统的不同而有所不同。在大多数系统中,进程ID从1开始递增,直到达到最大值后再从1重新开始分配(分配的都是已死的进程)。

进程ID为1的进程通常是init进程,它是系统启动时由内核创建的,是第一个用户级进程。除了init 进程,其它进程都是由其它进程创立的。创立新进程的进程叫父进程,新进程叫子进程。

使用命令“man 2 getpid”

橙色部分说明了这两函数:

getpid是获取进程号的            getppid是获取父进程号的’

我们编写测试程序,可以直接定义pid_t id1/id2,之后就直接调用getpid函数和getppid函数

然后可以将测试文件编译成可执行文件,到开发板执行后可以看见进程和其父进程的id

exec 函数族

exec函数族允许我们将当前进程替换为另一个进程,并且新进程可以继承原进程的一些资源

函数族包括

这些exec函数族中的函数实际上是用于在当前进程中执行一个新的程序,当调用这些函数时,当前进程的内容会被替换为新程序的内容,但进程的标识(如进程ID)以及其它一些属性(如进程的父子关系)通常会被保留

fork函数

fork函数会将原始进程(称为父进程)完全复制一份,包括代码、数据、堆栈等。然后,这个复制的进程就成为了新的子进程。父进程和子进程是两个独立的进程,它们各自有自己的内存空间和执行流程

在fork函数调用完成后,会返回两次。对于父进程,fork函数的返回值是子进程的进程ID,而对于子进程,fork函数的返回值是0。这样,通过检查返回值,我们可以确定当前代码正在哪个进程中执行,从而采取不同的操作

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid;  // 进程ID
    int n = 100;  // 初始值

    pid = fork();  // 创建一个新进程

    if (pid == -1) {  // 如果出错
        printf("Error: Failed to create child process.\n");
        return 1;
    }
    else if (pid == 0) {  // 子进程
        printf("Child process: PID=%d, n=%d\n", getpid(), ++n);  // 修改n值,并输出
    }
    else {  // 父进程
        printf("Parent process: PID=%d, n=%d\n", getpid(), n);  // 输出n值
    }

    return 0;
}

会输出

Child process: PID=2678, n=101
Parent process: PID=2677, n=100

n的值其实暗示了我们刚刚所说的“父进程和子进程是两个独立的进程,它们各自有自己的内存空间和执行流程”,子进程修改自己n的值是不会影响父进程的

进程终止exit:

当调用exit函数时,当前进程将会立即终止,并返回操作系统。同时,exit函数还会将终止状态传递给操作系统,供父进程获取

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("This is before the exit function\n");
    exit(0);
    printf("This is after the exit function\n");  // 这行代码不会执行
    return 0;
}

最后输出“This is before the exit function”

总之,exit函数可以立即终止当前进程,并传递一个状态值给操作系统,用于标识进程的终止状态

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

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

相关文章

系统架构设计师【第19章】: 大数据架构设计理论与实践 (核心总结)

文章目录 19.1 传统数据处理系统存在的问题19.2 大数据处理系统架构分析19.2.1 大数据处理系统面临挑战19.2.2 大数据处理系统架构特征 19.3 Lambda架构19.3.1 Lambda架构对大数据处理系统的理解19.3.2 Lambda架构应用场景19.3.3 Lambda架构介绍19.3.4  Lambda架构的实…

MySQL(四) - SQL优化

一、SQL执行流程 MySQL是客户端-服务器的模式。一条SQL的执行流程如下&#xff1a; 在执行过程中&#xff0c;主要有三类角色&#xff1a;客户端、服务器、存储引擎。 大致可以分为三层&#xff1a; 第一层&#xff1a;客户端连接到服务器&#xff0c;构造SQL并发送给服务器…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小&#xff0c;通常用于降低电压或升高电压&#xff0c;以便适应不同设备的需求。它们还可以提供隔离&#xff0c;使得输出电路与输入电路之间电气隔离&#xff0c;从而提高安全性。性能方面&#xff0c;电源变压器需要具有高效率、低温…

【OpenHarmony】ArkTS 语法基础 ④ ( ArkTS UI 渲染控制 | if else 条件渲染 | ForEach 循环渲染 )

文章目录 一、ArkTS UI 渲染控制1、if else 条件渲染2、ForEach 循环渲染 二、完整代码示例1、自定义组件代码2、主界面代码3、执行结果 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 ForEach 渲染控制文档 : https://developer.huawei.com/consumer/cn/doc/harmonyo…

Python中的Paramiko与FTP文件夹及文件检测技巧

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; Python代码的魅力与实用价值 在当今数字化时代&#xff0c;编程已成为一种不可或缺的技能。Python作为一种简洁、易读且功能强大的编程语言&#xff0c;受到了全球开发者的喜爱。它不仅适用于初学者入门&#xff0c…

玩转STM32-通信协议SPI(详细-慢工出细活)

文章目录 一、SPI的基础知识1.1 接口定义1.2 单机和多机通信 二、STM32的SPI工作过程2.1 从选择&#xff08;NSS&#xff09;脚管理2.2 时钟相位与极性2.3 SPI主模式2.4 SPI从模式 三、应用实例 一、SPI的基础知识 1.1 接口定义 SPI系统可直接与各个厂家生产的多种标准外围器…

通俗易懂的解释保护性看跌期权和抛补看涨期权!

今天带你了解通俗易懂的解释保护性看跌期权和抛补看涨期权&#xff01;当涉及期权交易时&#xff0c;保护性看跌期权和抛补看涨期权是两种常见的策略&#xff0c;它们的目的都是为了在特定市场情况下对投资进行保护或增强收益。 保护性看跌期权 保护性看跌期权是一种风险管理策…

如何以非交互方式将参数传递给交互式脚本

文章目录 问题回答1. 使用 Here Document2. 使用 echo 管道传递3. 使用文件描述符4. 使用 expect 工具 参考 问题 我有一个 Bash 脚本&#xff0c;它使用 read 命令以交互方式读取命令参数&#xff0c;例如 yes/no 选项。是否有一种方法可以在非交互式脚本中调用这个脚本&…

粘性代理 vs 轮换代理: 特点、优势与选择指南

在网络领域&#xff0c;代理服务器是一种常见的工具&#xff0c;用于隐藏真实IP地址并提供更安全和匿名的网络体验。 粘性代理和轮换代理是两种常见的代理类型&#xff0c;它们在IP持久性和变更频率等方面有所不同。 本文将介绍粘性代理和轮换代理的区别&#xff0c;并分析在…

1.Linux入门

文章目录 一、介绍1.1 操作系统1.2 Linux1.3 虚拟机1.4 安装 CentOS7 二、远程连接 Linux2.1 FinalShell2.2 远程连接Linux 三、扩展3.1 WSL3.2 虚拟机快照 一、介绍 1.1 操作系统 我们平常所用的电脑是个人桌面操作系统&#xff0c;也就是Windows或者是macOS 目前我们要学的…

npm彻底清理缓存

在使用npm过程中&#xff0c;肯定会遇到清缓存的情况&#xff0c;网上的命令一般为 npm cache clear --force有时笔者在清理缓存之后npm install依然失败&#xff0c;仔细发现&#xff0c;执行该命令之后npm报了一个警告 npm WARN using --force Recommended protections dis…

使用AppJail配置网络并创建tiny jail(未成功)

创建tiny jail成功了&#xff0c;但是网络配置这块&#xff0c;jail里只能ping通外面&#xff0c;而无法pkg更新软件。本文章是这篇文章Jail管理器AppJail的使用FreeBSD-CSDN博客的网络篇。 首先host主机配置pf防火墙 参考这里&#xff1a;Packet Filter - AppJail Handbook …

[经验] 羊肺怎么清洗才干净视频 #经验分享#学习方法#其他

羊肺怎么清洗才干净视频 1、羊肺怎么清洗才干净 羊肺是一种营养丰富的食材&#xff0c;含有丰富的蛋白质和维生素&#xff0c;是众多美食菜谱的重要原料之一。但是&#xff0c;由于羊肺的内部结构复杂&#xff0c;清洗起来比较麻烦。那么&#xff0c;如何清洗羊肺才能让它干净…

基于Python的Selenium详细教程

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…

在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

0、引言 ⚠️ 在开始之前&#xff0c;您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好&#xff0c;可以参考这篇文章 本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目&#xff08;工作空间&#xff09;。 1、本教程使用到的相关软件或产品 Ubuntu 20.0…

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

【Python报错】已解决Attributeerror: ‘list‘ object has no attribute ‘join‘( Solved)

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘join’ (Solved) 在Python中&#xff0c;字符串&#xff08;str&#xff09;对象有一个非常有用的join()方法&#xff0c;它允许你将序列中的元素连接&#xff08;join&#xff09;成一个字符串…

动态规划学习(混合背包,有依赖的背包,以及背包思想)

混合背包的定义&#xff1a; 混合背包问题就是混合01背包、完全背包和多重背包&#xff0c;可供选择的物体i可能有一个、或者无数个、或者有限个。 所以&#xff0c;就不要考虑这么多了&#xff0c;直接分这三种情况考虑就行&#xff01;&#xff01; 样例&#xff1a; for(…

优化财务管理制度提升企业经营效益—以审计代理记账为例

随着社会经济的快速发展&#xff0c;企业经营规模不断扩大&#xff0c;面临的财务管理问题也日益复杂&#xff0c;而作为其中的重要一环&#xff0c;审计代理记账已经成为了企业的必要组成部分&#xff0c;本文将重点探讨审计代理记账对于优化企业财务管理&#xff0c;提高经营…