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

Posted 雨轩(爵丶迹)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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


  1. echo: 显示某个环境变量值

  2. 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
    
  3. env: 显示所有环境变量

  4. unset: 清除环境变量

    env 环境变量
    
  5. 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
   以上是关于Linux环境变量和进程地址空间的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程概念--环境变量和进程地址空间

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

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

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

Linux进程概念二

Linux环境变量 & 进程地址空间