Linux学习笔记8

介绍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;  // 进程IDint 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.mzph.cn/diannao/22222.shtml

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

相关文章

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox&#xff0c;可参见下面这篇文章 QT之动态加载下拉框&#xff08;QComboBox&#xff09; 同理QTreeWidget也可以实现动态加载&#xff0c;在一些异步加载数据&#xff0c;并且数据加载比较耗时&#xff0c;非常实用。 效果 原理分析 要实现此类效…

数字展示具有广阔发展空间 市场规模保持增长态势

数字展示具有广阔发展空间 市场规模保持增长态势 数字展示是指以数字图像为核心&#xff0c;将触摸屏、红外线感应器、三维数字图像等相结合的高层次展示行业。与传统展示方式相比&#xff0c;数字展示能够突破时间、空间及形态的局限&#xff0c;将文字、图像等各种信息转化为…

vue 封装水球图

1、 安装 echarts 与 echarts-liquidfill pnpm i echarts pnpm i echarts-liquidfill 2、组件中引入 import * as echarts from echarts import echarts-liquidfill 3、封装通用组件 <div class"waterball-chart"><div ref"chartContainer" s…

从C到C++,C++入门篇(1)

1.什么是C C是一种通用编程语言&#xff0c;由Bjarne Stroustrup在1980年代初开发&#xff0c;作为C语言的扩展。 C支持多种编程范式&#xff0c;包括过程式编程、数据抽象、面向对象编程和泛型编程等。 这种语言在操作系统、游戏开发、图形界面、嵌入式系统、分布式系统、网…

变压器中的磁化和励磁电流波形

导出变压器中的磁化电流和励磁电流的图形方法具有说明性&#xff0c;因为它们使我们能够同时可视化产生这些波形的元素&#xff0c;例如磁通波形和磁性材料的典型 BH 曲线。 所得波形表明它们不是正弦波&#xff0c;并且对于励磁电流而言&#xff0c;它也不对称。 使用傅里叶…

Facebook代运营 | Facebook广告投放步骤及要点

Facebook体量大&#xff0c;素材的更新频率快&#xff0c;通过Facebook进行广告投放的用户也越来越多&#xff0c;Facebook坐拥大量用户&#xff0c;同时有着非常科学的用户画像构建系统和推送机制&#xff0c;对于很多广告涉足的伙伴来说&#xff0c;更加的友好。 1. 创建广告…

ubuntu系统 kubeadm方式搭建k8s集群

服务器环境与要求&#xff1a; 三台服务器 k8s-master01 192.168.26.130 操作系统&#xff1a; Ubuntu20.04 k8s-woker01 192.168.26.140 操作系统&#xff1a; Ubuntu20.04 k8s-woker02 192.168.26.150 操作系统&#xff1a; Ubuntu20.04 最低配置&#xff1a;2…

斯坦福 AI 团队被曝抄袭中国大模型开源成果;Zoom 创始人谈视频会议未来丨 RTE 开发者日报 Vol.218

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

2.29G大小Win 11系统来了,老爷机也能焕发第二春

Win 11 推出近三年以来微软大搞特搞的份额入侵计划&#xff0c;以目前情况来看算是彻底失败了。 国外知名机构 statcounter 最近公布了 4 月份 Windows 各版本份额调查结果。 其中显示&#xff0c;Win 11 占比 26% 左右&#xff0c;相较 2 月份 28% 反而开起了倒滑车。 来源&…

技术管理革新:三品PLM在电子电气行业的应用

随着科技的不断进步和市场需求的日益增长&#xff0c;电子电气行业正经历着前所未有的变革。产品生命周期的缩短和更新换代的加速&#xff0c;对企业的产品研发管理提出了更高的要求。在这样的背景下&#xff0c;产品生命周期管理PLM解决方案应运而生&#xff0c;旨在帮助电子电…

基于数据帧进行SQL查询

本教程将通过一个具体的案例来演示如何在Spark SQL中基于数据帧进行SQL查询。我们将从创建临时视图开始&#xff0c;然后使用spark对象执行SQL查询&#xff0c;包括投影、选择、统计和排序等操作。 具体步骤如下&#xff1a; 基于数据帧创建临时视图&#xff1a; 命令格式&…

深度学习笔记:1.anaconda安装

Download Anaconda Distribution | Anaconda 双击安装 设置环境变量 anaconda常用命令大全&#xff08;保姆级别建议收藏)-CSDN博客https://blog.csdn.net/m0_64892604/article/details/128806043?ops_request_misc%257B%2522request%255Fid%2522%253A%252217174671831680018…

This Python interpreter is in a conda environment

今天在查看python版本的时候出现警告 Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.io/activation 这个警告意味着你…

2024年6月4日13:48:07-3.8功能说明1.保存草稿2.支持自定义SKU销售规格3.全网爆款企划支持一键提交

创建产品产品保存草稿、自定义编辑规格功能使用手册 尊敬的淘工厂商家&#xff1a; 淘工厂近两个月收到很多商家对淘工厂发品&#xff08;上品&#xff09;效率提升的改进建议&#xff0c;淘工厂本月将针对产品发布页的发品效率提升上线一系列改进功能&#xff0c;希望能加速…

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列&#xff0c;即固定长度的队列&#xff0c;可以想象成一个环形队列 就类似于这种队列&#xff0c;队尾指针后会有一个空位&#xff0c;用于控制判断队列为空还是为满&#xff1b; typedef int MyDataType;typedef struct {MyDataType fron…

CTF-Misc学习笔记

这里写目录标题 Misc准备古典密码凯撒密码棋盘密码ADFGX密码培根密码栅栏密码摩斯密码猪圈密码键盘密码QWE编码ook编码BrainFUck密码aaencode密码jsfuckbase全家桶URL编码十六进制二进制 ascii码 2.图片隐写分析LSP 隐写实操图片修改宽高实操 零宽度字符隐写音频隐写分析与实操…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

anaconda创建虚拟环境并配置到JupyterNotebook

anaconda创建虚拟环境并配置到JupyterNotebook 一、查看当前环境二、创建虚拟环境三、配置JupyterNotebook内核一、查看当前环境 如上图所示,在开始菜单中扎到Anaconda Prompt(Anaconda)并打开。在命令行窗口中输入命令conda info -e或者conda env list查看已安装的虚拟环境,…

开放式耳机哪个品牌质量比较好?五大热门品牌PK推荐

作为一名热爱音乐的DJ爱好者&#xff0c;我深知一款适合DJ使用的开放式耳机应该具备哪些特点。最近&#xff0c;我深入评测了几款热门开放式耳机&#xff0c;从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天&#xff0c;我想为大家分享我的评测结果&#xff0c;希…

网易云音乐格式在线转换

应用分享&#xff1a;众所周知网易云下载的格式为 .NCM&#xff0c;只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3&#xff0c;无需安装&#xff0c;转换后就能在任意播放器使用。 使用地址&#xff1a; https://ncm.worthsee.com/ 网络研究观 数据泄露…