品牌词类的网站怎么做优化,网上购物哪个商城好,全屏 网站 代码,wordpress幻灯片的调用代码目录 进程的特点
进程特点的介绍
进程时如何实现并发性的
进程间如何切换
概念铺设
PC指针
上下文
环境变量
PATH
修改PATH
HOME
SHELL
env
命令行参数
什么是命令行参数#xff1f;
打印命令行参数
通过函数获得环境变量
getenv
命令行参数 env
修改环境变…目录 进程的特点
进程特点的介绍
进程时如何实现并发性的
进程间如何切换
概念铺设
PC指针
上下文
环境变量
PATH
修改PATH
HOME
SHELL
env
命令行参数
什么是命令行参数
打印命令行参数
通过函数获得环境变量
getenv
命令行参数 env
修改环境变量
环境变量总结
本地变量 内建命令
查看本地变量
内建命令 进程的特点 根据我们前面学习过的进程我们总结一下进程的特点。 竞争性进程直接是相互竞争的进程想要运行就必须竞争CPU资源也需要竞争其他资源。 独立性进程之间是互不干扰的所以如果某一个进程挂掉之后并不会影响其他的进程。 并行性如果在多CPU的环境下多个进程可以同时运行。 并发性在单CPU的环境下进程之间是基于时间片轮转的进程在运行特定的时间后就必须换下一个进程来运行。 进程特点的介绍
竞争性由于我们每一个进程想要运行都是需要占用CPU资源的但是我们的CPU只有一个所以我们的进程必须竞争CPU资源所以我们的进程是具有竞争性的。
独立性在前面学习的子进程中我们的父子进程共享同一份代码而数据也是写时拷贝的并且我们的进程都是有自己独立的代码和数据所以我们进程也是互补干扰的所以为我们的进程时具有独立性的。
并行性当计算机有多个CPU的时候计算机内多个进程就可以在多个CPU上同时运行所以这就是进程的并行性。
并发性由于大多数环境下计算机中都只有一个CPU所以为了让进程都可以得到CPU资源那么就需要让进程可以在运行的时候切换让每个进程执行特定的时间就切换到下一个进程由于计算机的速度时很快的所以我们并不会感受到进程间切换的卡顿感。 下面我们主要介绍一下进程的并发性。 进程时如何实现并发性的
在计算机中一定有很多的进程所以进程之间必须要切换才能让CPU可以执行不同的进程但是什么时候切换也是一个问题所以这里还引入了时间片轮转就是让进程运行固定的时间然后切换到下一个进程。 所以并发就是通过两点来实现 进程间切换 时间片轮转 所以我们的并发就是基于进程间切换的时间片轮转算法。 进程间如何切换
既然我们知道进程是通过切换和时间片轮转来实现的并发那么进程是如何切换的 概念铺设 PC指针
我们的计算机时如何知道我们的程序执行到哪一步的
由于我们的进程时需要切换的所以我们进程再次被切换到CPU上执行到时候那么我们的计算机时如何知道该程序被执行到哪一步的
函数计数器pc指针就是通过函数计数器也称为PC指针来实现。
如果CPU想再次执行我们该程序的代码那么CPU就会执行pc指针的下一条代码。 上下文
在提这个概念之前我们先用一个场景来描述一下。
场景
你有一个要去当兵的朋友你的朋友被部队选上了然后你的朋友很高兴回宿舍后什么都不管第二天就走了然后当了两年兵回来后发现自己宿舍的东西没了自己的学籍也没了因为在这两年里面学校不知道你的朋友当兵去了然后由于你的朋友每天都不上课所以被学校开除了学籍。
场景
还是你的朋友同样被选上了这一次你的朋友回宿舍后收拾好了自己的行囊然后给辅导员也说了这个事情辅导员帮你的朋友办理了各种手续以及档案等你曾经的记录然后让你的朋友带走这次你的朋友回来后把档案那些东西又交给了学校学校帮忙恢复了学习然后你的朋友又可以开始正常上课了。
通过上面的这两个故事我们感觉到了什么那么如果我们一个CPU要被切换出去的时候CPU曾经的数据要怎么办
在我们的 CPU 中有很多寄存器这些寄存器就是保存的是当前进程的数据如果我们要切换走一个进程的时候我们需要把这些寄存器里面的数据也让该进程带走好让该进程下一次回来的时候在把上一次运行的数据带过来继续运行。
所以寄存器里面的数据就是 “上下文” 。
而进程就必须把上下文保护好好让下一次运行的时候知道如何运行。 概念布设完毕所以进程间是如何切换的 进程切换的要求 保护上下文将寄存器里面的数据让进程保存起来。 恢复上下文当一个进程恢复的时候需要先将它的上下文加载进去。 进程的特点就到这里我们也说了进程的并发也说了为什么可以实现并发还有并发的条件以及实现并发条件之一的进程切换的部分问题。 环境变量 在说这个概念之前我们想先看一下环境变量然后我们正在说环境变量的概念。 PATH
PATH 是一个系统中的环境变量那么如何查看PATH呢
[lxyhecs-165234 linux5]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin
我们想要查看 PATH 我们可以 echo 然后 $ 环境变量就可以查看。
那么这个PATH 是什么呢
我们现在先写一个代码来看一下。
int main()
{for(int i 0; i 10; i)printf(myproc: [%d]\n, i);return 0;
}
我们然后编译这个代码我们运行它。
[lxyhecs-165234 linux5]$ ./myproc
myproc: [0]
myproc: [1]
myproc: [2]
myproc: [3]
myproc: [4]
myproc: [5]
myproc: [6]
myproc: [7]
myproc: [8]
myproc: [9]
我们运行的时候 ./myproc 我们前面说过其实我们的指令也是代码那么为什么我们的指令就不用表明路劲呢
因为我们的指令会自己查找而在哪查找呢就是在 PATH 这个环境变量中。
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin
我们就会在上面的这些路劲里面查找我们的指令上面这些路劲就是我们的默认指令查找路劲。
如果我们想要自己的程序也不用指明路劲呢 修改PATH
我们只需要把我们这个程序的路劲添加到 PATH 中那我们我们就不用指明路劲了下面我们看一下如何添加。
[lxyhecs-165234 linux5]$ PATH/home/lxy/108/linux5
如果我们之间这样就是把 PATH 给覆盖了并不是添加了当前路劲所以我们应该如何添加呢
[lxyhecs-165234 linux5]$ PATH$PATH:/home/lxy/108/linux5
下面在查看一下 PATH
[lxyhecs-165234 linux5]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin:/home/lxy/108/linux5
我们就添加进来了下面看一下是否可以不用路劲就可以执行。
[lxyhecs-165234 linux5]$ myproc
myproc: [0]
myproc: [1]
myproc: [2]
myproc: [3]
myproc: [4]
myproc: [5]
myproc: [6]
myproc: [7]
myproc: [8]
myproc: [9]
确实可以执行实际上这个 PATH环境变量是临时的我们的 PATH 环境变量实际上实在系统中的然后 bash 启动的时候读取的所以我们可以随便修改这个环境变量如果修改错了我们直接重启 bash 就可以了所以我们直接改掉 PATH 路劲然后我们看那些指令是否就不能用了。
[lxyhecs-165234 linux5]$ PATH/
[lxyhecs-165234 linux5]$ ll
-bash: ls: command not found
[lxyhecs-165234 linux5]$ ls
-bash: ls: command not found
[lxyhecs-165234 linux5]$ cd ..
[lxyhecs-165234 108]$ cd linux5
我们看到我们的 ll ls 部分指令就使用不了了但是还是有一些指令可以使用。
我们下面重启一下 bash 就可以了。 我们下面在看两个环境变量。 HOME 我们直接打印查看。
[lxyhecs-165234 linux5]$ echo $HOME
/home/lxy
我们当前的 lxy 用户查看的 HOME就是上面的这个样子下面我们换 root 在查看一下。
[roothecs-165234 lxy]# echo $HOME
/root
我们的 root 用户的 HOME 环境变量就是上面的这个样子。 SHELL 在看一个 SHELL环境变量。
[lxyhecs-165234 linux5]$ echo $SHELL
/bin/bash
SHELL 就是我们使用的 shell 是什么我们这里使用的 shell就是 bash。 当然我们的环境变量不止这么一些我们怎么样查看全部的环境变量呢 env 查看全部的环境变量。
[lxyhecs-165234 linux5]$ env
XDG_SESSION_ID6727
HOSTNAMEhecs-165234
TERMxterm
SHELL/bin/bash
HISTSIZE10000
SSH_CLIENT123.138.70.232 62136 22
SSH_TTY/dev/pts/0
USERlxy
LD_LIBRARY_PATH:/home/lxy/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
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:
MAIL/var/spool/mail/lxy
PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin
PWD/home/lxy/108/linux5
LANGen_US.UTF-8
HISTCONTROLignoredups
SHLVL1
HOME/home/lxy
LOGNAMElxy
SSH_CONNECTION123.138.70.232 62136 192.168.0.70 22
LESSOPEN||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR/run/user/1000
HISTTIMEFORMAT%F %T lxy
_/usr/bin/env
OLDPWD/home/lxy/108
上面1就是我们全部的环境变量。
我们挑一些介绍一下。 HOSTNAMEhecs-165234
HOSTNAME就是主机名 SHELL/bin/bash
SHELL我们前面介绍了。 HISTSIZE10000
HISTSIZE当我们 history 的时候我们就会打印出我们的历史指令而我们的历史指令的保存是由个数限制的而 HISTSIZE 就是最大的存储历史指令的限制。 SSH_TTY/dev/pts/0
这个就是表示我们 bash 输出的时候往哪里输出我们可以在启动一个然后我们 echo 向这个里面写入 hello USERlxy
USER表示当前的使用者。 PWD/home/lxy/108/linux5
PWD表示我们当前文件的路劲。 OLDPWD/home/lxy/108
OLDPWD表示我们上一次在那个路劲下。 [lxyhecs-165234 linux5]$ cd /
[lxyhecs-165234 /]$ cd -
/home/lxy/108/linux5
[lxyhecs-165234 linux5]$ cd -
/
[lxyhecs-165234 /]$ cd -
/home/lxy/108/linux5
cd - 表示就是去上一次的路劲。
上面就是我们的环境变量。
除了我们上面使用命令行操作查看环境变量其实我们还可以使用函数来查看环境变量。 在谈下面的环境变量之前这里先谈一个叫命令行参数。 命令行参数 什么是命令行参数
在我们输入指令的时候后满经常会带一些选项而这些雪乡就是命令行参数。
实际上在C语言或者C中的 main 函数也是可以带命令行参数的只是我们之前的环境都基本是在 windows 下所以没有命令我们也就接触不到命令行参数我们先写一个程序看一下。
int main(int argc, char* argv[])
{if(argc ! 2){printf(需要两个参数\n);return 0;}printf(OK\n);return 0;
} 这里我们看这一段代码我们的 main 函数实际上可以带几个参数其中这里带了两个参数一个 argc 一个 argv。
argc表示传过来多少个命令行参数其中最少就是1个也就是运行该函数的参数。
argv表示命令行参数的里面传过来的字符串我们的argv里面存到就是一个char* 的指针。 下面我们运行该函数看一下。
首先我们只有一个参数也就是直接运行该函数。
[lxyhecs-165234 linux5]$ ./myproc
需要两个参数
下面我们传入参数随便传入一个参数。
[lxyhecs-165234 linux5]$ ./myproc -a
OK
[lxyhecs-165234 linux5]$ ./myproc kkkkkk
OK
这里的参数什么都可以只要由两个参数就可以了。 打印命令行参数
既然我们可以拿到命令行参数也有命令行参数的个数那么我们就可以打印它。
int main(int argc, char* argv[])
{for(int i 0; i argc; i)printf(argv[%d]: %s\n, i, argv[i]);return 0;
}
这样就可以打印命令行参数了。
我们下面运行改代码试一下。
只有一个参数。
[lxyhecs-165234 linux5]$ ./myproc
argv[0]: ./myproc
多个参数。
[lxyhecs-165234 linux5]$ ./myproc -a -b -c hello
argv[0]: ./myproc
argv[1]: -a
argv[2]: -b
argv[3]: -c
argv[4]: hello 通过函数获得环境变量 getenv SYNOPSIS#include stdlib.hchar *getenv(const char *name);
getenv 函数传入一个环境变量名然后返回环境变量的值。
下面使用程序来看一下。
int main(int argc, char* argv[])
{if(argc ! 2){printf(需要环境变量\n);}else {printf(%s : %s\n, argv[1], getenv(argv[1]));}return 0;
}
这里我们通过命令行参数的方式传入环境变量名然后使用 getenv 函数来获得环境变量。
这里我们直接传入PATH试一下。
[lxyhecs-165234 linux5]$ ./myproc PATH
PATH : /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin
这里我们获得了环境变量。
下面我们使用环境变量来查看我们的用户我们分别会使用 root 用户和普通用户来查看。
int main()
{if(strcmp(getenv(USER), root) 0){printf(无视权限\n);}else {printf(普通用户\n);}return 0;
}
使用普通用户。
[lxyhecs-165234 linux5]# ./myproc
普通用户
下面使用 root 用户。
[roothecs-165234 linux5]# ./myproc
无视权限
所以这也就是我们的的权限问题。 命令行参数 env 在 main 函数中的命令行参数其实还可以传入一个参数就是环境变量。
在打印命令行参数前我们先说明一下其实我们的命令行参数和环境变量env中最后一个指针都是null所以即使我们不适用 argv 也可以打印。
int main(int argc, char* argv[], char* env[])
{for(int i 0; argv[i]; i)printf(argv[%d]: %s\n, i, argv[i]);return 0;
}
下面传入参数打印。
[lxyhecs-165234 linux5]$ ./myproc -a -b -c -d
argv[0]: ./myproc
argv[1]: -a
argv[2]: -b
argv[3]: -c
argv[4]: -d 那么下面我们也就直接打印一下我们的 env 环境变量。
[lxyhecs-165234 linux5]$ ./myproc
env[0]: XDG_SESSION_ID6739
env[1]: HOSTNAMEhecs-165234
env[2]: TERMxterm
env[3]: SHELL/bin/bash
env[4]: HISTSIZE10000
env[5]: SSH_CLIENT123.139.60.208 35357 22
env[6]: SSH_TTY/dev/pts/0
env[7]: USERlxy
env[8]: LD_LIBRARY_PATH:/home/lxy/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
env[9]: 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:
env[10]: MAIL/var/spool/mail/lxy
env[11]: PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lxy/.local/bin:/home/lxy/bin
env[12]: PWD/home/lxy/108/linux5
env[13]: LANGen_US.UTF-8
env[14]: HISTCONTROLignoredups
env[15]: SHLVL1
env[16]: HOME/home/lxy
env[17]: LOGNAMElxy
env[18]: SSH_CONNECTION123.139.60.208 35357 192.168.0.70 22
env[19]: LESSOPEN||/usr/bin/lesspipe.sh %s
env[20]: XDG_RUNTIME_DIR/run/user/1000
env[21]: HISTTIMEFORMAT%F %T lxy
env[22]: _./myproc
env[23]: OLDPWD/home/lxy/108
所以这样也可以打印环境变量。
通过上面的学习我们可以看一下环境变量了。
我们在上面发现环境变量是可以变化的当我们登录不同的账户的时候环境变量中的UESR就会变化我们可以知道环境变量是动态的可以变化的。
在而且我们的环境变量实际上是存储在系统中的每一次打开bash就会加载所以我们的环境变量也是居于持久性。
在main函数中我们看到我们main函数还可以传入 env 变量所以我们的 env 实际上是可以被所有的子进程继承的由于我们的进程都是 bash 帮我们创建所以我们的所有的子进程都是可以有环境变量。
其实我们的环境变量还是可以修改的我们看一下。 修改环境变量 我们现在想自己定义一个属于我们自己的环境变量那么该怎么办呢
[lxyhecs-165234 linux5]$ MYVALUE10001
我们上面这样可以吗
实际上是不可以的这样定义的话实际上是“本地变量”。
我们查看一下是查不到的。
[lxyhecs-165234 linux5]$ env | grep MVALUE
[lxyhecs-165234 linux5]$
那么我们的环境变量怎么定义。
[lxyhecs-165234 linux5]$ export MYVALUE
[lxyhecs-165234 linux5]$ env | grep MYVALUE
MYVALUE10001
我们可以将本地变量前面加一个 export 就可以变为环境变量。
那么怎么删除呢
[lxyhecs-165234 linux5]$ unset MYVALUE
[lxyhecs-165234 linux5]$ env | grep MYVALUE
[lxyhecs-165234 linux5]$ 环境变量总结 全局性 动态 持久 可修改
其实不仅仅有这些特性还有一些想了解的可以查一下。 本地变量 内建命令 最后一个话题我们前面提到的本地变量和内建命令。 查看本地变量 set命令
这里为了方便知道我们查到的是本地变量我们可以先定义一个本地变量的值。
[lxyhecs-165234 linux5]$ MYVALUE10000
[lxyhecs-165234 linux5]$ set | grep MYVALUE
MYVALUE10000
下面我们看一下本地变量有一些什么。
由于太多我们只挑几个看一下。
PS1[\u\h \W]\$
PS2
PS4
我们这三个实际上就是本地变量其中 PS1 就是表示命令行解释器的提示符 我们的普通用户就是 $
而下面的 就是还可以输入命令
[lxyhecs-165234 linux5]$ ls \-a\-d\本地变量其实只会在本BASH中有效。 内建命令
我们现在来看一个操作。
[lxyhecs-165234 linux5]$ MYVALUE19999
[lxyhecs-165234 linux5]$ echo $MYVALUE
19999
我们前面不是说我们的这些指令实际上就是程序吗那么我们的程序就是 bash 创建子进程来的但是我们的 MYVALUE 是一个本地变量本地变量子进程不是不会继承吗那么echo是怎么样显示出来的
这里就要纠正之前的一个说法了其实我们的指令不一定bash会创建子进程如果是一些比较安全的指令那么还是bash自己执行的。
所以我们的命令实际上是由两种 常规命令bash创建子进程执行。 内建命令bash亲自执行自己调用函数。
还有一个内建命令比如 cd
下面我们写一个代码来看一下cd命令
首先介绍一个函数
SYNOPSIS#include unistd.hint chdir(const char *path);
DESCRIPTIONchdir() changes the current working directory of the calling process to the directory specified in path.
该函数传入一个路劲然后可以修改该进程的路劲。
int main(int argc, char* argv[])
{if(argc ! 2){printf(请输入修改路劲\n);}else {sleep(20);printf(开始修改路劲\n);chdir(argv[1]);printf(路劲修改结束\n);sleep(20);}return 0;
}
我们在休眠的过程中查看我们的该进程的路劲然后休眠后在查看我们的路劲。
[lxyhecs-165234 linux5]$ ./myproc /
开始修改路劲
路劲修改结束
在我们休眠前我们查到
lrwxrwxrwx 1 lxy lxy 0 Aug 5 19:51 cwd - /home/lxy/108/linux5
休眠后
lrwxrwxrwx 1 lxy lxy 0 Aug 5 19:51 cwd - /
这里看到我们确实修改成功。