娄底网站建设,网站建设的总结200字,网站建设实施方案及预算,如何优化公司网站Linux进程理解【环境变量】
提到环境变量#xff0c;大家可能有些陌生#xff0c;如果编写过Java就知道#xff0c;编写Java需要提前安装JDK#xff0c;这个操作就是配置Java的编码环境#xff0c;在Linux中当然也少不了环境变量#xff0c;下面我们就一起来看看 文章目…Linux进程理解【环境变量】
提到环境变量大家可能有些陌生如果编写过Java就知道编写Java需要提前安装JDK这个操作就是配置Java的编码环境在Linux中当然也少不了环境变量下面我们就一起来看看 文章目录 Linux进程理解【环境变量】1. 环境变量1.1 环境变量表1.2 添加环境变量1.3 获取环境变量 2. main函数参数2.1 参数功能2.2 参数列表 3. 进程优先级3.1 系统进程查看3.2 优先级修改 4. 进程特性 1. 环境变量
环境变量的概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数 举个例子我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途并且环境变量在系统当中通常具有全局特性 常见环境变量
PATH系统命令的搜索路径HOME指定用户的主工作目录(即用户登陆到Linux系统中时默认的目录)SHELL : 当前Shell它的值通常是/bin/bash
通过指令echo $环境变量名来查看指定环境变量信息
echo $环境变量名 //查看指定环境变量1.1 环境变量表
将很多环境变量聚集到一起管理就组成了环境变量表
通过指令env来查看本用户对应的环境变量表
env //查看本用户环境变量表XDG_SESSION_ID255667
HOSTNAMEVM-4-2-centos //机器名
SHELL/bin/bash //shell
TERMxterm
HISTSIZE3000 //历史命令数量最大值
SSH_CLIENT111.173.233.59 14786 22
OLDPWD/home/sakura/Test
SSH_TTY/dev/pts/0
USERsakura //用户
LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arc01;31:*.arj01;31:*.taz01;31:*.lha01;31:*.lz401;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.tzo01;31:*.t7z01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lrz01;31:*.lz01;31:*.lzo01;31:*.xz01;31:*.bz201;31:*.bz01;31:*.tbz01;31:*.tbz201;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.war01;31:*.ear01;31:*.sar01;31:*.rar01;31:*.alz01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.cab01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.webm01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36: //配色方案
LD_LIBRARY_PATH:/root/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/sakura/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL/var/spool/mail/root
PWD/home/sakura //当前文件路径
LANGen_US.utf8
HOME/home/sakura //家目录
SHLVL2
LOGNAMEsakura //当前登录用户
SSH_CONNECTION111.173.233.59 14786 10.0.4.2 22
LESSOPEN||/usr/bin/lesspipe.sh %s
PROMPT_COMMANDhistory -a; history -a; history -a; history -a; printf \033]0;%s%s:%s\007 ${USER} ${HOSTNAME%%.*} ${PWD/#$HOME/~}
XDG_RUNTIME_DIR/run/user/0
HISTTIMEFORMAT%F %T
_/usr/bin/env还可以通过set指令查看本地变量和本用户环境变量表内容很多并不是很常用
set //查看本地变量和本用户环境变量表环境变量表实际上就是一个指针数组指针指向具体的环境变量内容 这里有一个问题在Linux下ls、pwd等指令本质也是可执行程序和我们自己编写的可执行程序没有什么区别而我们自己实现的需要带上./才能执行这是为什么呢
PATH环境变量中存储着各种指令的路径Linux中的指令都是C语言编写的本质都是可执行程序我们执行指令就相当于运行程序OS会根据PATH提供的路径找到对应指令(可执行程序)来直接运行我们自己编写的程序不被包含到PATH环境变量中直接执行会找不到所以需要加上./才能运行 知道了这一点那么我们如果将自己实现的可执行程序加入到PATH变量中是否也可以想指令一样使用呢答案是肯定的
export PATH$PATH:绝对路径 //添加路径到PATH变量直接像指令一样使用是无法运行的下面我们将路径加入PATH变量中 这样就可以像指令一样运行我们自己编写的程序了
注意
普通用户修改环境变量列表没什么大问题本次修改只在本次有效再次登录时环境列表会被重置root用户尽量不要修改环境变量列表避免出现意外
我们还可以将程序写到usr/bin目录下也可以起到以上的效果 我们可以在这个目录下看到熟悉的ls等指令将程序写到此处就相当于将应用安装到了系统中指令在这删除之后也无法再使用了这也就是Linux下安装和卸载软件的原理
1.2 添加环境变量
通过变量名内容直接在命令行中添加本地变量可以设置本地变量本地变量只能供shell使用是不被子进程共享的
变量名内容 //添加本地变量通过指令unset 本地变量名可以删除本地变量
unset 本地变量名 //取消本地变量加上关键字export就可以将变量写入环境变量表环境变量表具有全局属性被所有子进程共享 1.3 获取环境变量
程序运行时环境变量表会传递给程序使用可以在程序中获取环境变量
使用extern char** environ二级字符指针获取它是指向envp字符串指针数组的使用函数char* getenv(char* name)获取使用main函数的第三个参数char* envp获取
先来看看使用extern char** environ二级字符指针获取
#include stdio.h
#include unistd.hextern char** environ; //声明int main()
{for(int i 0; environ[i]; i){printf(environ[%d]-%s\n,i ,environ[i]);} return 0;
}当然也可以通过函数char* getenv(char* name)获取获取成功返回环境变量内容失败则返回NULL
#include stdio.h
#include stdlib.hint main()
{char* user getenv(USER);if(user NULL){perror(无此环境变量!\n);exit(-1);}else{printf(USER%s\n, user);}return 0;
}结合以上内容我们通过getenv()函数获取环境变量信息再将程序路径添加到PATH变量中就可以自己模拟实现指令了
#include stdio.h
#include stdlib.hint main()
{printf(%s, getenv(PWD));return 0;
}使用第三种方法获取之前我们先来讲解一下主函数main的三个参数
2. main函数参数
2.1 参数功能
我们平时使用main函数都是不带参的其实它是有三个参数的
int argc表示传入程序中的元素个数char argv[]表示传入程序中的元素表由bash制作*char envp[]表示环境变量表*
argv也是一个字符串指针数组每个元素对应的一个字符串字符串以’\0’为结束标志数组以NULL为标识结束数组的 我们还是通过程序来观察三个参数
#include stdio.h
#include stdlib.hint main(int argc, char* argv[], char* envp[]) {printf(传入的有效元素个数%d\n, argc);printf(元素表元素信息\n);for(int i 0; i argc; i){printf(argv[%d]-%s\n, i, argv[i]);}printf(获取环境变量表前七个环境变量的信息\n);for(int i 0; i 7; i){printf(envp[%d]-%s\n, i, envp[i]);}return 0;
}通过程序运行可以发现
./mytest这个可执行程序也会被传入元素表中我们也可以自己传入元素到元素表中这也就是指令后可以跟上参数列表的原理了类似ls -a -lls就是一个可执行程序-a、-l就是传入参数列表main 函数可以通过envp参数获取到环境变量表的信息也就是环境变量表可以通过参数传递给程序使用这就是环境变量表有全局属性能被共享的本质了
2.2 参数列表
下面我们来看看参数列表的使用也就是利用 char* argv[] 来实现指定参数完成指定任务
#include stdio.h
#include stdlib.h
#include string.h//打印提示信息
void Argvment(const char* name)
{printf(Argvment: %s [-a|-b|-c]\n, name);exit(0);
}int main(int argc, char* argv[])
{if(argc ! 2) //确保选项只有一个{printf(指令错误请重新输入!\n);Argvment(argv[0]);return 0;}if(strcmp(argv[1], -a) 0){printf(执行任务a!\n);}else if(strcmp(argv[1], -b) 0){printf(执行任务b!\n);}else if(strcmp(argv[1], -c) 0){printf(执行任务c!\n);}else{printf(指令错误请重新输入!\n);}return 0;
}选项和程序一起构成一张元素表传递给 char* argv[] 参数通过不同的选项来调用不同的功能
3. 进程优先级
进程优先级就是指的是进程的优先权也就是指CPU资源分配的先后顺序优先权高的进程先执行优先级低的后执行这样的目的是为了改善系统性能
3.1 系统进程查看
进程的PCB信息都有自己的意义
UID执行者身份PID进程代号PPID父进程代号PRI进程优先级默认为80NI进程优先级对应的修正值范围是[-20, 19] 其中PRI的一个求法PIR(new) PRI(old) nice。另外我们的进程会通过CPU来做计算CPU中有调度器这个调度器的作用就是来对进程的优先级一碗水端平不会过度的使得其进程优先级很高也不会过度的使得其进程优先级很低所以这里的NI值也不会很高这样就可以达到一碗水端平的目的。 通过ps指令来查看进程信息
ps -l/ps -al //查看进程信息3.2 优先级修改
优先级修改步骤
使用top命令进入任务管理器输入 r 进入修改模式输入想要修改的进程的PID输入NI值完成修改
修改进程优先级的操作不难而且很少会修改这里我就不演示了
注意 修改优先级后最终优先级初始优先级NI值 NI值的范围为 [-20, 19]设置时超出部分将会无效 优先级的修改行为并不是连续的每次修改都是在最开始的基础上进行进程重新开始后其PRI和NI都会恢复原值
4. 进程特性
总结一下进程的特性
竞争性系统进程数目很多但是CPU资源有限所以进程之前存在竞争独立性多进程运行需要独享资源互不干扰并行多个进程可以在多个CPU下分别同时运行并发多个进程在一个CPU下采用进程切换的方式在一段时间内让多个进程都得以推进 Linux进程理解—环境变量到这里就介绍结束了本篇文章对你由帮助的话期待大佬们的三连你们的支持是我最大的动力
文章有写的不足或是错误的地方欢迎评论或私信指出我会在第一时间改正