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 COMMAND
3669469 3669470 3669470 3669439 pts/0    3681645 S     1001   0:00 -bash
3669470 3681645 3681645 3669439 pts/0    3681645 R+    1001   0:00 ps axj
3669470 3681646 3681645 3669439 pts/0    3681645 R+    1001   0:00 grep --color=auto 3669470

//第1种           不需要加路径就能运行程序的方法
[dy@VM-12-10-centos jincheng_12_5]$ ll
total 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]$ ./proc
hello 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]$ proc
hello world!

//只保存3000条命令
[dy@VM-12-10-centos jincheng_12_5]$ echo $HISTSIZE
3000
//显示之前有多少条命令
[dy@VM-12-10-centos jincheng_12_5]$ history |wc -l
636
[dy@VM-12-10-centos jincheng_12_5]$ history
//将之前的命令全部输出到显示器上

//显示所有环境变量
[dy@VM-12-10-centos jincheng_12_5]$ env
LS_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.utf8
HISTTIMEFORMAT=%F %T
HOSTNAME=VM-12-10-centos
OLDPWD=/home/dy
USER=dy
PWD=/home/dy/jincheng_12_5
HOME=/home/dy
MAIL=/var/spool/mail/dy
SHELL=/bin/bash
TERM=xterm
SHLVL=1
PROMPT_COMMAND=history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"
LOGNAME=dy
PATH=/home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dy/jincheng_12_5
HISTSIZE=3000
LESSOPEN=||/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:3669470
Segmentation fault (core dumped)
[dy@VM-12-10-centos jincheng_12_5]$ export MY_VAL
[dy@VM-12-10-centos jincheng_12_5]$ ./proc
I am a proc : pid:3700163 ppid:3669470
hello 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 $hello
1234
[dy@VM-12-10-centos jincheng_12_5]$ set | grep hello
hello=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;
}

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获取环境

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

进程地址空间

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

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

我们稍微将代码更改一下

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

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

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

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

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

进程地址空间是什么?

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

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

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

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

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

到此这篇关于Linux环境变量和进程地址空间介绍的文章就介绍到这了,更多相关Linux环境变量和进程空间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何linux环境下配置环境变量过程图解

    jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在linux环境下的root同级目录下配置software目录 将下载好的jdk上传到software文件夹里面 (我使用的操作软件是) 到software这个目录下. 输入命令:cd /software 输入命令:ll 就可以看到我们的jdk包 解压文件 解压命令 tar xzvf jdk-8u111-linu

  • 浅谈Linux环境变量文件介绍

    在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量. 系统级环境变量:每一个登录到系统的用户都能够读取到系统级的环境变量 用户级环境变量:每一个登录到系统的用户只能够读取属于自己的用户级的环境变量 自然而然地,环境变量的配置文件也相应的被分成了系统级和用户级两种. 系统级 /etc/profile 在系统启动后第一个用户登录时运行,并从/etc/profile.d目录的配置文件中搜集shell的设置,使用该文件配置的环境变量将应用于登录到系统的每一个用户.

  • Linux运维基础进程管理实时监控控制

    目录 1.后台运行作业 2.使用信号控制进程 基本进程管理信号 3.监控进程活动 IO负载 4.实时进程监控 top用于实现全屏动态显示系统信息 1.后台运行作业 1.sleep 999 & (运行作业) [root@localhost ~]# sleep 999 & [1] 3670 2.ps -ef|grep sleep(查看进程) [root@localhost ~]# ps -ef|grep sleep root 3670 3642 0 10:54 pts/1 00:00:00 s

  • 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 COMMAND 3669469 3669470 3669470 366943

  • 完美介绍linux环境变量与部分命令

    linux环境变量介绍 环境变量:bash shell用一个称作"环境变量(environment variables)"的特性来存储有关shell会话和工作环境的信息,它允许你在内存中存储数据,以便运行在shell上的程序和脚本访问,这些数据可以用来识别用户.账户.系统.shell特性以及任何其他你需要存储的数据. shell中的环境变量有全局环境变量和局部环境变量,通过KV(variable=value)的形式声明一个局部变量,export这个局部变量,则升级成为全局环境变量. 关

  • 浅谈三种配置linux环境变量的方法(以java为例)

    1. 修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. ·用文本编辑器打开/etc/profile ·在profile文件末尾加入: export JAVA_HOME=/usr/share/jdk1.6.0_14 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/li

  • Linux 环境变量详解及实例

    Linux环境变量 ~/.bash_profile && ~/.bashrc 用户登陆Linux操作系统的时候,"/etc/profile", "~/.bash_profile"等配置文件会被自动执行. 执行过程是这样的: 登陆Linux系统时,首先启动"/etc/profile", 然后启动用户目录下的"~/.bash_profile", 如果"~/.bash_login"和"~

  • Linux环境变量配置的完整攻略

    Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置MySQL环境变量路径:/home/uusama/mysql/bin Linux读取环境变量 读取环境变量的方法: export命令显示当前系统定义的所有环境变量 echo $PATH命令输出当前的PATH环境变量的值 这两个命令执行的效果如下 uusama@ubuntu:~$ export decl

  • 详解Linux环境变量配置全攻略

    在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置MySQL环境变量路径:/home/uusama/mysql/bin Linux读取环境变量 读取环境变量的方法: export命令显示当前系统定义的所有环境变量 echo $PATH命令输出当前的PATH环境变量的值 这两个命令执行的效果如下 uusama@ubuntu:~$ export declare -x HOME=

  • 浅析linux环境变量export命令详解

    由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引发的问题 1.${HOME}:首先, HOME 是个变量,它代表你的 home 目录,变量前必须加上 $ 符号,否则会报错 usr/local/dvsdk为dvsdk的destination folder 由#echo $DVSDK测试环境变量添加成功否 2.想要使得开机时自动加载这个环境变量免除以后每次设置,可将其写入/etc/re.local  Linux e

  • Linux内核私闯进程地址空间并修改进程内存的方法

    进程地址空间的隔离 是现代操作系统的一个显著特征.这也是区别于 "古代"操作系统 的显著特征. 进程地址空间隔离意味着进程P1无法以随意的方式访问进程P2的内存,除非这块内存被声明是共享的. 这非常容易理解,我举个例子. 我们知道,在原始野人社会,是没有家庭的观念的,所有的资源都是部落内共享的,所有的野人都可以以任意的方式在任意时间和任何其他野人交互.类似Dos这样的操作系统就是这样的,内存地址空间并没有隔离.进程可以随意访问其它进程的内存. 后来有了家庭的观念,家庭的资源被隔离,人们

  • Shell编程中的特殊变量之进程状态变量介绍

    进程状态变量 1.$$获取当前shell的进程号(PID) 2.$!执行上一个指令的PID 3.$?获取执行上一个命令的返回值(0为成功,非零为失败,这个很常用) 4.$_在此之前执行的命令或脚本的最后一个参数 复制代码 代码如下: cat> test$.sh echo'$$='$$ echo'$!='$! echo'$?='$? echo'$@='$@ echo'$_='$_ #输出如下 sh test\$.sh 1 2 3 $$=2556 $!= $?=0 $@=1 2 3 $*和$@的区别

随机推荐