如何分析Linux环境变量和进程地址空间
发表于:2024-10-16 作者:千家信息网编辑
千家信息网最后更新 2024年10月16日,如何分析Linux环境变量和进程地址空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Linux环境变量和进程地址空间//查看进程pid
千家信息网最后更新 2024年10月16日如何分析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安全错误
数据库的锁怎样保障安全
网络安全好找工作
qq收件服务器设置
义乌市明道网络技术有限公司
校园网络安全主题演讲比赛
服务器机柜供电
浙里办服务器和网络错误
网络安全科研动态
署五笔软件开发
软件开发盈利方式
软件开发中完成的主要文档
网络安全防诈骗防传销
郑州微群网络技术有限公司
北京cmmi软件开发
媒体服务器 app
闪电网络技术进展
阿里云国外服务器安全吗
经纶数据库
安卓软件开发 重启按钮
广东反邪教网络安全教育
深圳蓝天软件开发有限公司
软件开发交付检测标准
中央互联网科技
江苏易销互联网科技
小猪v5社交电商软件开发
ios14网络安全性低
奥汀服务器
中星网络技术有限公司
网络技术应用名词解释服务
net数据库版本管理
荣县软件开发文档