linux查看环境变量命令,linux中的进程、环境变量和虚拟地址

 2023-09-25 阅读 26 评论 0

摘要:目录冯诺依曼体系结构操作系统进程概念程序和进程什么是程序什么是进程查看进程信息进程、进程标识符&进程状态进程创建僵尸状态和僵尸进程孤儿进程环境变量定义常见的环境变量查看环境变量设置环境变量临时生效永久生效为什么需要加$[环境变量名]?环境变量的代码

目录

    • 冯诺依曼体系结构
    • 操作系统
    • 进程概念
      • 程序和进程
        • 什么是程序
        • 什么是进程
        • 查看进程信息
      • 进程、进程标识符&进程状态
        • 进程创建
        • 僵尸状态和僵尸进程
        • 孤儿进程
    • 环境变量
      • 定义
      • 常见的环境变量
      • 查看环境变量
      • 设置环境变量
        • 临时生效
        • 永久生效
        • 为什么需要加$[环境变量名]?
      • 环境变量的代码验证
        • 从main 函数的参数中获取
        • 通过 getenv 函数获取特定环境变量的值
        • 通过environ参数进行获取
    • 进程虚拟地址空间

冯诺依曼体系结构

1、数据存储在“内存”当中

2、计算机中的数据一切皆二进制

linux查看环境变量命令。冯诺依曼体系机构提出的数据架构图:
在这里插入图片描述
数据由输入设备输入,再由内存将数据提交给CPU进行处理,再返回内存通过输出设备输出

操作系统

操作系统是软件,操作系统在管理计算机的软硬件资源

管理 = 描述 ( 自定义数据类型 ( struct ) ) + 组织 (链表 )

操作系统 = 操作系统内核 + 应用

系统调用接口 ( 函数 ) :操作系统为程序员提供的函数,程序调用这些函数可以使用操作系统管理的资源

查看环境变量linux。库函数:一帮程序员将难用的系统调用接口重新封装了一遍

如何区分一个函数是库函数还是系统调用函数?

man [函数名称]:左上角如果是2,则是系统调用函数,左上角是3,则是库函数

进程概念

程序和进程

什么是程序

程序就是经过源代码编译出来的文件,这个文件是静态的

什么是进程

进程就是程序运行时的实例,是动态的,从内核的角度来看,进程是操作系统分配资源的实体

查看进程信息

linux进程状态。使用 ps aux 命令可查看所有进程信息
在这里插入图片描述
在 ps aux 后添加 | grep ./程序名可查看特定进程

进程、进程标识符&进程状态

进程标识符(PID):在操作系统中唯一标志一个进程

进程状态

并行:多个进程在同一时刻拥有不同的CPU进行运算,称之为并行并发:多个进程在同一时刻只能由一个进程拥有CPU进行运算,称之为并发

大的方面来说:就绪,运行,阻塞

细分的角度来说:

R:运行状态S:可中断睡眠状态D:不可中断睡眠状态T:暂停状态ctrl + z:使得一个程序变成暂停状态,但此时进程是存在的,并不等同于ctrl + c
如果需要恢复至运行状态需要输入 fg 后回车t:跟踪状态,在进行gdb调试时会出现X(ctrl+x):死亡状态	Z:僵尸进程

linux查当前进程。程序计数器:保存了进程即将要运行的下一条指令

上下文信息:保存了寄存器当中的内容

内存指针:指向了程序地址空间

记账信息:使用CPU的时长,占用内存大小

IO信息:保存了当前进程打开文件的信息

/proc:保存了当前操作系统维护的所有进程信息,每一个进程都是一个文件夹

进程创建

linux如何查看进程、1、getpid()函数:获取当前进程的pid号,谁调用获取谁的

2、geippid()函数:获取当前进程的父进程的pid号,谁调用获取谁的父进程
在这里插入图片描述
随后 ./test
在这里插入图片描述
现在就得到了父进程和当前进程的pid号
在这里插入图片描述
现在让他们不停止
在这里插入图片描述
此时我想知道是什么启动了这个进程
在这里插入图片描述
可以发现启动这个进程是是 -bash ,也就是命令行解释器

这也意味着这个进程的父进程其实就是bash

fork函数:可以让程序员在代码中创建一个子进程

pid_t fork(void);1、没有参数2、pit_t:本质是整形3、含义:

在这里插入图片描述
在这里插入图片描述
查看进程发现有两个进程
在这里插入图片描述
此时需要区分一下谁是父进程谁是子进程
在这里插入图片描述
这样就不仅显示了当前进程,同时也在当前进程的pid后生成了父进程的pid号
在这里插入图片描述
黄标为当前进程,蓝标为父进程

返回值:创建子进程失败:返回-1创建成功:①:>0 返回给父进程②:==0 返回给子进程大于0的值本质是子进程的PID号原理:fork创建的子进程的PCB拷贝父进程的PCB

僵尸状态和僵尸进程

docker环境变量。更改一下刚才的fork代码
在这里插入图片描述
父进程先创建子进程,随后走 else 逻辑,在执行打印后开始执行sleep;
子进程被创建后走 else if 逻辑,执行打印后跳出,最后 return;
在这里插入图片描述
执行后全打印出来
在这里插入图片描述
再看看刚才的 child 的 pid 号
在这里插入图片描述
看到后边显示进程状态为Z,代表为僵尸进程

僵尸进程的产生由来:子进程先于父进程退出,子进程在退出的时候,会告知父进程,父进程没有来得及回收子进程的资源,导致子进程的PCB没有被释放

kill 命令:kill + [ pid ],可以杀死一个进程
在这里插入图片描述
试着杀死刚才的僵尸进程
在这里插入图片描述
发现僵尸进程依旧存在

kill 第二个指令:kill -9 [ pid ],为强杀,对进程的杀伤力更强
在这里插入图片描述
此时发现依然无法杀除僵尸进程

僵尸进程的危害:子进程的PCB没办法得到释放,相当于内存泄漏了

linux查看进程grep?怎么解决?

1、重启操作系统,代价大,不推荐

2、kill 父进程,僵尸进程就不存在了
在这里插入图片描述
这样发现父进程和僵尸进程一起不见了

代价相对较大,不推荐

3、进程等待,推荐的方式,优雅的方式

孤儿进程

linux终止进程、再次更改 fork
在这里插入图片描述
这次让父进程先结束,子进程不结束
在这里插入图片描述
1 号进程是启动时操作系统创建的第一个进程,这也意味着刚才创建的子进程在回收时是由 1 号进程来进行回收的

孤儿进程:

1、父进程先于子进程退出,子进程会被 1 号进程所领养,子进程在退出到时候,就会由 1 号进程回收子进程的退出资源,从而子进程就不会变成僵尸进程,称这样的进程为孤儿进程

2、进程状态当中没有一个状态称之为孤儿状态,但是有进程被称为孤儿进程

环境变量

定义

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

常见的环境变量

PATH:保存了可执行程序的搜索路径

简述在虚拟机中安装centos7的过程,在这里插入图片描述
在其中有个重要的间隔符“:”,在:前后都是路径,代表了搜索时所经过的路径

SHELL:保存了命令行解释器的名称
HOME:保存了当前用户的家目录

查看环境变量

echo $[ 环境变量名 ]
env 可以查看操作系统中所有的环境变量

在这里插入图片描述

设置环境变量

固定范式:export [ 环境变量名称 ] = $[ 环境变量名 ]:[ 新增加的路径 ]

临时生效

在这里插入图片描述
如果直接使用fork会发现此时无法找到fork指令
在这里插入图片描述
设置后发现PATH里边已经存在了fork的路径,再次使用fork
在这里插入图片描述
但是当克隆一个终端时,fork便无法使用
在这里插入图片描述
这就是临时生效,即将export执行在了命令行当中,只在当前终端中生效

永久生效

~/.bashrc    或者    ~/.bash_profile:环境变量文件当新打开一个终端的时候,就会读取环境变量文件当中的内容

接着打开文件
在这里插入图片描述
在这里插入图片描述
或者
在这里插入图片描述
在这里插入图片描述
在其中都能看到export命令

linux用户环境变量、可以创建一个新的环境变量
在这里插入图片描述
创建后用 source 命令来通知系统重新读取这个文件
在这里插入图片描述
再查看,已经创建成功了
在这里插入图片描述
接着拷贝终端试试
在这里插入图片描述
发现也可以使用,代表这是永久生效,即写到环境变量文件中,每次启动终端的时候,都会被加载

为什么需要加$[环境变量名]?

拿PATH来实验一下吧

正常的PATH里边有这些
在这里插入图片描述
如果光这么写
在这里插入图片描述
可以发现里边只剩下了一个路径
在这里插入图片描述
此时再ls
在这里插入图片描述
哦豁,没有找到这个命令,因为全被删除掉了

环境变量的代码验证

从main 函数的参数中获取

首先写一个程序
在这里插入图片描述
试着输入命令
在这里插入图片描述
此时会输出多少个命令?或者说我们实际上向程序内输入了多少个命令?

三个?
在这里插入图片描述
其实是四个,即 命令参数的个数也将可执行程序也计算在内

linux用户环境变量配置文件,而在程序中,我们可以将传递进去的命令预先设置一个动作,而在程序接收到这个命令后便会做出反应
在这里插入图片描述
再执行程序,发现程序在发现输入 -a 时便退出了
在这里插入图片描述
再试一下换个顺序
在这里插入图片描述
看来是实现了依据输入的指令做出预设的动作

同样我们可以命令行参数来获取环境变量

char* env[]:组织格式

永远都在数组的最后一个元素存放一个NULL指针
在这里插入图片描述
此时 ./main 一下
在这里插入图片描述
发现拿到了很多的环境变量,和之前的 查看环境变量 中的 env 命令是一样的

通过 getenv 函数获取特定环境变量的值

char *getnev(const char *name)

参数:
name:环境变量名称
返回值:环境变量的值

例如“PATH” ==> getenv(“PATH”)

返回值就是:

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/stealth/.local/bin:/home/stealth/bin

怎么验证?

编写一串代码,使用 getenv 来输出PATH的环境变量的值
在这里插入图片描述
得到输出
在这里插入图片描述
通过对比一致

通过environ参数进行获取

environ:参数是C库当中定义的,程序员如果要使用,可以使用 extern 关键字进行使用,类型是:char**

试着用 extern 关键字调用 enviorn 输出环境变量
在这里插入图片描述
同样输出成功了
在这里插入图片描述

进程虚拟地址空间

写一串代码
在这里插入图片描述
运行一下,不出所料的输出了同样的数值
在这里插入图片描述
此时让他们取地址
在这里插入图片描述
在这里插入图片描述
发现他们的地址是一样的

更改一下代码,在子进程中将 g_val 更改为100
在这里插入图片描述
再运行一下
在这里插入图片描述
发现在同一个地址,却有不一样的数据?

这就是虚拟地址,每一个进程在启动的时候都会被分配一个空间,但这个空间是虚拟出来的,并不能直接保存数据

程序员在代码当中看到的地址并不是真正的物理内存地址,而是操作系统内核虚拟出来的地址,虚拟地址并不能保存数据,保存数据是物理内存在保存

意义:进程虚拟地址空间,构成了进程的独立性,一个进程修改数据,不会影响另外一个进程

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/95116.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息