如何分析Linux环境变量和进程地址空间
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,如何分析Linux环境变量和进程地址空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Linux环境变量和进程地址空间//查看进程pid
千家信息网最后更新 2025年02月01日如何分析Linux环境变量和进程地址空间
如何分析Linux环境变量和进程地址空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
Linux环境变量和进程地址空间
//查看进程pid和父进程[dy@VM-12-10-centos jincheng_12_5]$ ps ajx | head -1 && ps axj | grep 3669470 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND3669469 3669470 3669470 3669439 pts/0 3681645 S 1001 0:00 -bash3669470 3681645 3681645 3669439 pts/0 3681645 R+ 1001 0:00 ps axj3669470 3681646 3681645 3669439 pts/0 3681645 R+ 1001 0:00 grep --color=auto 3669470//第1种 不需要加路径就能运行程序的方法[dy@VM-12-10-centos jincheng_12_5]$ lltotal 28-rw-rw-r-- 1 dy dy 73 Dec 5 16:46 Makefile-rwxrwxr-x 1 dy dy 17432 Dec 5 16:47 proc-rw-rw-r-- 1 dy dy 75 Dec 5 16:47 proc.c[dy@VM-12-10-centos jincheng_12_5]$ sudo cp proc /usr/bin/ //将自己的可执行程序添加到系统路径下[sudo] password for dy: [dy@VM-12-10-centos jincheng_12_5]$ proc //将自己的可执行程序添加到系统路径下,就可以不要加./路径了hello world![dy@VM-12-10-centos jincheng_12_5]$ ./prochello world![dy@VM-12-10-centos jincheng_12_5]$ sudo rm /usr/bin/proc //从系统路径下删除[dy@VM-12-10-centos jincheng_12_5]$ proc-bash: /usr/bin/proc: No such file or directory//第二种[dy@VM-12-10-centos jincheng_12_5]$ $PATH-bash: /home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin: No such file or directory[dy@VM-12-10-centos jincheng_12_5]$ pwd/home/dy/jincheng_12_5//将当前路径添加到环境变量PATH当中[dy@VM-12-10-centos jincheng_12_5]$ PATH=$PATH:/home/dy/jincheng_12_5[dy@VM-12-10-centos jincheng_12_5]$ prochello world!//只保存3000条命令[dy@VM-12-10-centos jincheng_12_5]$ echo $HISTSIZE3000//显示之前有多少条命令[dy@VM-12-10-centos jincheng_12_5]$ history |wc -l636[dy@VM-12-10-centos jincheng_12_5]$ history//将之前的命令全部输出到显示器上 //显示所有环境变量[dy@VM-12-10-centos jincheng_12_5]$ envLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:LANG=en_US.utf8HISTTIMEFORMAT=%F %T HOSTNAME=VM-12-10-centosOLDPWD=/home/dyUSER=dyPWD=/home/dy/jincheng_12_5HOME=/home/dyMAIL=/var/spool/mail/dySHELL=/bin/bashTERM=xtermSHLVL=1PROMPT_COMMAND=history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"LOGNAME=dyPATH=/home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dy/jincheng_12_5HISTSIZE=3000LESSOPEN=||/usr/bin/lesspipe.sh %s_=/usr/bin/env
echo: 显示某个环境变量值
export: 设置一个新的环境变量
[dy@VM-12-10-centos jincheng_12_5]$ ./proc //本地变量没有I am a proc : pid:3700079 ppid:3669470Segmentation fault (core dumped)[dy@VM-12-10-centos jincheng_12_5]$ export MY_VAL[dy@VM-12-10-centos jincheng_12_5]$ ./procI am a proc : pid:3700163 ppid:3669470hello dy/home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dy/jincheng_12_5/home/dy/bin/bash
env: 显示所有环境变量
unset: 清除环境变量
env 环境变量
set: 显示本地定义的shell变量和环境变量
//设置环境变量[dy@VM-12-10-centos jincheng_12_5]$ hello=1234//输出环境变量 记得要加$符[dy@VM-12-10-centos jincheng_12_5]$ echo $hello1234[dy@VM-12-10-centos jincheng_12_5]$ set | grep hellohello=1234
在命令行上运行的大部分的指令,它的父进程都是bash,bash创建子进程,子进程执行你的命令。
通过代码获取环境变量
#include#include #include int main(int argc, char *argv[], char *env[]){ for(int i = 0; argv[i]; ++i)//为命令行参数做解释 //for(int i = 0; i < argc; ++i) { printf("argv[%d]:%s\n",i,argv[i]); } for(int i = 0; env[i]; ++i)//可以通过代码获取环境变量 { printf("env[%d]:%s\n",i,env[i]); } return 0;}
int x = atoi(argv[2]);int y = atoi(argv[3]);if(strcmp(argv[1],"-a") == 0){ printf("%d + %d = %d\n",x,y,x+y);}else{ printf("%d - %d = %d\n",x,y,x-y);}
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以'\0'结尾的环境字符串
也可以通过第三方变量environ获取环境
#includeint main(int argc, char *argv[]){ extern char **environ; int i = 0; for(; environ[i]; i++){ printf("%s\n", environ[i]); } return 0;}
进程地址空间
#include#include int g_val = 0;int main(){ pid_t id = fork(); if(id < 0) { perror("fork() fail\n"); } else if(id == 0) { printf("I am a child:%d,%d,%p\n",getpid(),g_val,&g_val); }else { printf("I am a fatcher:%d,%d,%p\n",getppid(),g_val,&g_val); } return 0;}
通过运行结果,我们看到两个进程的变量的值和地址是一样的,这里没有对代码做任何更改,子进程按照父进程为模板,所以地址是一样的。
我们稍微将代码更改一下
#include#include int g_val;int main(){ pid_t id = fork(); if(id < 0) { perror("fork() fail"); } else if(id == 0) { g_val = 100; printf("I am a child:%d,%d,%p\n",getpid(),g_val,&g_val); }else { sleep(3); printf("I am a fatcher:%d,%d,%p\n",getppid(),g_val,&g_val); } return 0;}
此时我们发现,变量的值已经更改了,父进程为0,子进程为100,但是变量的地址仍然是一样的。
通过这个运行结果,我们可以得知以下几点。
两个进程的变量的值不一样,所以父子进程的变量绝对不是同一个变量地址值一样,绝对不是物理地址!!!我们看到的地址,全部都是虚拟地址!!!真实的物理地址,用户是看不到的,由OS统一管理(OS负责将虚拟地址-》物理地址)代码是共享的,而数据各自私有一份(写时拷贝)
关于为什么是虚拟地址,而不是物理地址?
进程地址空间是什么?
进程地址空间:是看待内存的方式,抽象出来的一个概念,内核struct mm struct,这样的每个进程,都认为自己独占系统内存资源(你认为你老爸的家产是你一个人的)区域划分:地址空间为线性,被划分成一个一个的区域,[start,end]虚拟地址:在[start, end]之间的各个地址叫做虚拟地址
虚拟地址到物理地址的一个映射
为什么要存在进程地址空间?
保护物理内存,不收到任何进程内的地址的直接访问,方便进行合法性检验将内存管理和进程管理进行解耦让每个进程,以同样的方式,来看待代码和数据
以后我们可以直接说出进程和程序的区别。
看完上述内容,你们掌握如何分析Linux环境变量和进程地址空间的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
地址
进程
变量
环境
空间
代码
命令
物理
路径
程序
内存
系统
运行
方法
管理
分析
两个
内容
区域
可以通过
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
校园软件开发规划书简介
市北区ios软件开发公司
yii2数据库前缀
数据库数据模型设计
干网络安全的工资咋样
数据库建立视图的句子
计算机网络技术论文答辩问题
mysql服务器网速
数据库为什么能跑崩溃
生物信息数据库如何建立
常州推广rpa软件开发公司
数据库外文资料
开发区app软件开发
软件开发资质甲级
英雄联盟手游日服服务器
青少年积极参加网络安全科普
php连接两个数据库
网络安全责任观是指
mysql数据库运用例子
枪火游侠服务器断网
数据库中单价数据类型
软件开发品牌w开头
禅道开源版服务器搭建
抚州民宿软件开发
虚拟化服务器硬件配置
网络安全德育课心得
厦门 互联网科技有限公司
旧物交易程序数据库
怎么下载微信无法连接到服务器
明日之后怎样找橡树岭的服务器