Linux環(huán)境變量和進(jìn)程地址空間介紹
Linux環(huán)境變量和進(jìn)程地址空間
//查看進(jìn)程pid和父進(jìn)程 [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種 不需要加路徑就能運(yùn)行程序的方法 [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/ //將自己的可執(zhí)行程序添加到系統(tǒng)路徑下 [sudo] password for dy: [dy@VM-12-10-centos jincheng_12_5]$ proc //將自己的可執(zhí)行程序添加到系統(tǒng)路徑下,就可以不要加./路徑了 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 //從系統(tǒng)路徑下刪除 [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 //將當(dāng)前路徑添加到環(huán)境變量PATH當(dāng)中 [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 //將之前的命令全部輸出到顯示器上 //顯示所有環(huán)境變量 [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: 顯示某個(gè)環(huán)境變量值
export: 設(shè)置一個(gè)新的環(huán)境變量
[dy@VM-12-10-centos jincheng_12_5]$ ./proc //本地變量沒(méi)有 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: 顯示所有環(huán)境變量
unset: 清除環(huán)境變量
env 環(huán)境變量
set: 顯示本地定義的shell變量和環(huán)境變量
//設(shè)置環(huán)境變量 [dy@VM-12-10-centos jincheng_12_5]$ hello=1234 //輸出環(huán)境變量 記得要加$符 [dy@VM-12-10-centos jincheng_12_5]$ echo $hello 1234 [dy@VM-12-10-centos jincheng_12_5]$ set | grep hello hello=1234
在命令行上運(yùn)行的大部分的指令,它的父進(jìn)程都是bash,bash創(chuàng)建子進(jìn)程,子進(jìn)程執(zhí)行你的命令。
通過(guò)代碼獲取環(huán)境變量
#include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(int argc, char *argv[], char *env[]) { for(int i = 0; argv[i]; ++i)//為命令行參數(shù)做解釋 //for(int i = 0; i < argc; ++i) { printf("argv[%d]:%s\n",i,argv[i]); } for(int i = 0; env[i]; ++i)//可以通過(guò)代碼獲取環(huán)境變量 { 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); }
每個(gè)程序都會(huì)收到一張環(huán)境表,環(huán)境表是一個(gè)字符指針數(shù)組,每個(gè)指針指向一個(gè)以'\0'結(jié)尾的環(huán)境字符串
也可以通過(guò)第三方變量environ獲取環(huán)境
#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; }
進(jìn)程地址空間
#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; }
通過(guò)運(yùn)行結(jié)果,我們看到兩個(gè)進(jìn)程的變量的值和地址是一樣的,這里沒(méi)有對(duì)代碼做任何更改,子進(jìn)程按照父進(jìn)程為模板,所以地址是一樣的。
我們稍微將代碼更改一下
#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; }
此時(shí)我們發(fā)現(xiàn),變量的值已經(jīng)更改了,父進(jìn)程為0,子進(jìn)程為100,但是變量的地址仍然是一樣的。
通過(guò)這個(gè)運(yùn)行結(jié)果,我們可以得知以下幾點(diǎn)。
兩個(gè)進(jìn)程的變量的值不一樣,所以父子進(jìn)程的變量絕對(duì)不是同一個(gè)變量地址值一樣,絕對(duì)不是物理地址!??!我們看到的地址,全部都是虛擬地址?。?!真實(shí)的物理地址,用戶(hù)是看不到的,由OS統(tǒng)一管理(OS負(fù)責(zé)將虛擬地址–》物理地址)代碼是共享的,而數(shù)據(jù)各自私有一份(寫(xiě)時(shí)拷貝)
關(guān)于為什么是虛擬地址,而不是物理地址?
進(jìn)程地址空間是什么?
進(jìn)程地址空間:是看待內(nèi)存的方式,抽象出來(lái)的一個(gè)概念,內(nèi)核struct mm struct,這樣的每個(gè)進(jìn)程,都認(rèn)為自己獨(dú)占系統(tǒng)內(nèi)存資源(你認(rèn)為你老爸的家產(chǎn)是你一個(gè)人的)區(qū)域劃分:地址空間為線性,被劃分成一個(gè)一個(gè)的區(qū)域,[start,end]虛擬地址:在[start, end]之間的各個(gè)地址叫做虛擬地址
虛擬地址到物理地址的一個(gè)映射
為什么要存在進(jìn)程地址空間?
保護(hù)物理內(nèi)存,不收到任何進(jìn)程內(nèi)的地址的直接訪問(wèn),方便進(jìn)行合法性檢驗(yàn)將內(nèi)存管理和進(jìn)程管理進(jìn)行解耦讓每個(gè)進(jìn)程,以同樣的方式,來(lái)看待代碼和數(shù)據(jù)
以后我們可以直接說(shuō)出進(jìn)程和程序的區(qū)別。
到此這篇關(guān)于Linux環(huán)境變量和進(jìn)程地址空間介紹的文章就介紹到這了,更多相關(guān)Linux環(huán)境變量和進(jìn)程空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux系統(tǒng)配置sftp服務(wù)以及實(shí)現(xiàn)免密登錄方式
這篇文章主要介紹了Linux系統(tǒng)配置sftp服務(wù)以及實(shí)現(xiàn)免密登錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Jexus 5.8.2正式發(fā)布! 為Asp.Net Core生產(chǎn)環(huán)境提供平臺(tái)支持
Jexus 5.8.2正式發(fā)布!Jexus支持ASP.NET、PHP為特色的集高安全性和高性能為一體的WEB服務(wù)器和反向代理服務(wù)器,感興趣的小伙伴們可以參考一下2017-06-06Vim如何使用相對(duì)行號(hào)實(shí)現(xiàn)一切操作詳解
在使用用Vim時(shí)時(shí)常會(huì)遇到像復(fù)制多行或者想快速向下/向上移動(dòng)多行時(shí)而不知道行數(shù)的情況, 今天發(fā)現(xiàn)一個(gè)Vim對(duì)此有幫助的特性: 相對(duì)行號(hào),下面這篇文章主要給大家介紹了關(guān)于Vim如何使用相對(duì)行號(hào)實(shí)現(xiàn)一切操作的相關(guān)資料,需要的朋友可以參考下。2017-11-11淺談linux下的一些常用函數(shù)的總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇淺談linux下的一些常用函數(shù)的總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10Linux中使用Cron定時(shí)執(zhí)行SQL任務(wù)的實(shí)現(xiàn)步驟
在Linux系統(tǒng)中,計(jì)劃任務(wù)(Cron)是一種強(qiáng)大的工具,可以自動(dòng)執(zhí)行預(yù)定的任務(wù),它非常適合定期運(yùn)行腳本、備份數(shù)據(jù)、清理臨時(shí)文件等一系列重復(fù)性任務(wù),本文給大家介紹了如何在Linux中使用Cron定時(shí)執(zhí)行SQL任務(wù),需要的朋友可以參考下2024-11-11