我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何分析Linux环境变量和进程地址空间

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何分析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<stdio.h>#include<stdlib.h>#include<unistd.h>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;}

如何分析Linux环境变量和进程地址空间

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);}

如何分析Linux环境变量和进程地址空间

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以'\0'结尾的环境字符串

如何分析Linux环境变量和进程地址空间

也可以通过第三方变量environ获取环境

#include <stdio.h>int main(int argc, char *argv[]){    extern char **environ;    int i = 0;    for(; environ[i]; i++){    printf("%s\n", environ[i]);    }return 0;}

如何分析Linux环境变量和进程地址空间

进程地址空间

#include<stdio.h>#include<unistd.h>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;}

如何分析Linux环境变量和进程地址空间

通过运行结果,我们看到两个进程的变量的值和地址是一样的,这里没有对代码做任何更改,子进程按照父进程为模板,所以地址是一样的。

我们稍微将代码更改一下

#include<stdio.h>#include<unistd.h>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;}

如何分析Linux环境变量和进程地址空间

此时我们发现,变量的值已经更改了,父进程为0,子进程为100,但是变量的地址仍然是一样的。

通过这个运行结果,我们可以得知以下几点。

两个进程的变量的值不一样,所以父子进程的变量绝对不是同一个变量地址值一样,绝对不是物理地址!!!我们看到的地址,全部都是虚拟地址!!!真实的物理地址,用户是看不到的,由OS统一管理(OS负责将虚拟地址–》物理地址)代码是共享的,而数据各自私有一份(写时拷贝)

关于为什么是虚拟地址,而不是物理地址?

进程地址空间是什么?

进程地址空间:是看待内存的方式,抽象出来的一个概念,内核struct mm struct,这样的每个进程,都认为自己独占系统内存资源(你认为你老爸的家产是你一个人的)区域划分:地址空间为线性,被划分成一个一个的区域,[start,end]虚拟地址:在[start, end]之间的各个地址叫做虚拟地址

如何分析Linux环境变量和进程地址空间

虚拟地址到物理地址的一个映射

如何分析Linux环境变量和进程地址空间

为什么要存在进程地址空间?

保护物理内存,不收到任何进程内的地址的直接访问,方便进行合法性检验将内存管理和进程管理进行解耦让每个进程,以同样的方式,来看待代码和数据

如何分析Linux环境变量和进程地址空间

以后我们可以直接说出进程和程序的区别。

如何分析Linux环境变量和进程地址空间

看完上述内容,你们掌握如何分析Linux环境变量和进程地址空间的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何分析Linux环境变量和进程地址空间

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何分析Linux环境变量和进程地址空间

如何分析Linux环境变量和进程地址空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Linux环境变量和进程地址空间//查看进程pid和父进程[dy@VM-12-10-cen
2023-06-25

Linux环境变量和进程地址空间介绍

目录linux环境变量和进程地址空间通过代码获取环境变量进程地址空间关于为什么是虚拟地址,而不是物理地址?Linux环境变量和进程地址空间//查看进程pid和父进程 [dy@VM-12-10-centos jincheng_12_5]$ p
2022-06-04

Linux中exit函数如何与进程环境变量交互

在Linux中,exit() 函数是用于正常终止进程的系统调用当一个进程调用 exit() 函数时,它会执行以下操作:关闭所有打开的文件描述符。释放进程占用的内存和其他资源。将进程的状态设置为终止(TERMINATED)。通知父进程
Linux中exit函数如何与进程环境变量交互
2024-08-30

Linux内核中如何添加新功能隐藏进程地址空间内存不被窃取

这篇文章将为大家详细讲解有关Linux内核中如何添加新功能隐藏进程地址空间内存不被窃取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先看怎样能获取其它进程地址空间的内存,答案是ptrace
2023-06-15

编程热搜

目录