目录
进程的特点
进程特点的介绍
进程时如何实现并发性的
进程间如何切换
概念铺设
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呢?
[lxy@hecs-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;
}
我们然后编译这个代码,我们运行它。
[lxy@hecs-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 中,那我们我们就不用指明路劲了,下面我们看一下如何添加。
[lxy@hecs-165234 linux5]$ PATH=/home/lxy/108/linux5
如果我们之间这样就是把 PATH 给覆盖了,并不是添加了当前路劲,所以我们应该如何添加呢?
[lxy@hecs-165234 linux5]$ PATH=$PATH:/home/lxy/108/linux5
下面在查看一下 PATH
[lxy@hecs-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
我们就添加进来了,下面看一下是否可以不用路劲就可以执行。
[lxy@hecs-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 路劲然后我们看那些指令是否就不能用了。
[lxy@hecs-165234 linux5]$ PATH=/
[lxy@hecs-165234 linux5]$ ll
-bash: ls: command not found
[lxy@hecs-165234 linux5]$ ls
-bash: ls: command not found
[lxy@hecs-165234 linux5]$ cd ..
[lxy@hecs-165234 108]$ cd linux5
我们看到我们的 ll ls 部分指令就使用不了了,但是还是有一些指令可以使用。
我们下面重启一下 bash 就可以了。
我们下面在看两个环境变量。
HOME
我们直接打印查看。
[lxy@hecs-165234 linux5]$ echo $HOME
/home/lxy
我们当前的 lxy 用户查看的 HOME,就是上面的这个样子,下面我们换 root 在查看一下。
[root@hecs-165234 lxy]# echo $HOME
/root
我们的 root 用户的 HOME 环境变量就是上面的这个样子。
SHELL
在看一个 SHELL环境变量。
[lxy@hecs-165234 linux5]$ echo $SHELL
/bin/bash
SHELL 就是我们使用的 shell 是什么,我们这里使用的 shell就是 bash。
当然我们的环境变量不止这么一些,我们怎么样查看全部的环境变量呢?
env
查看全部的环境变量。
[lxy@hecs-165234 linux5]$ env
XDG_SESSION_ID=6727
HOSTNAME=hecs-165234
TERM=xterm
SHELL=/bin/bash
HISTSIZE=10000
SSH_CLIENT=123.138.70.232 62136 22
SSH_TTY=/dev/pts/0
USER=lxy
LD_LIBRARY_PATH=:/home/lxy/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
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:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=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:*.jpg=01;35:*.jpeg=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:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=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:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;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
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/lxy
LOGNAME=lxy
SSH_CONNECTION=123.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就是我们全部的环境变量。
我们挑一些介绍一下。
HOSTNAME=hecs-165234
HOSTNAME:就是主机名
SHELL=/bin/bash
SHELL:我们前面介绍了。
HISTSIZE=10000
HISTSIZE:当我们 history 的时候我们就会打印出我们的历史指令,而我们的历史指令的保存是由个数限制的,而 HISTSIZE 就是最大的存储历史指令的限制。
SSH_TTY=/dev/pts/0
这个就是表示我们 bash 输出的时候往哪里输出,我们可以在启动一个然后我们 echo 向这个里面写入 hello
USER=lxy
USER:表示当前的使用者。
PWD=/home/lxy/108/linux5
PWD:表示我们当前文件的路劲。
OLDPWD=/home/lxy/108
OLDPWD:表示我们上一次在那个路劲下。
[lxy@hecs-165234 linux5]$ cd /
[lxy@hecs-165234 /]$ cd -
/home/lxy/108/linux5
[lxy@hecs-165234 linux5]$ cd -
/
[lxy@hecs-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* 的指针。
下面我们运行该函数看一下。
首先我们只有一个参数,也就是直接运行该函数。
[lxy@hecs-165234 linux5]$ ./myproc
需要两个参数
下面我们传入参数,随便传入一个参数。
[lxy@hecs-165234 linux5]$ ./myproc -a
OK
[lxy@hecs-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;
}
这样就可以打印命令行参数了。
我们下面运行改代码试一下。
只有一个参数。
[lxy@hecs-165234 linux5]$ ./myproc
argv[0]: ./myproc
多个参数。
[lxy@hecs-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.h>
char *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试一下。
[lxy@hecs-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;
}
使用普通用户。
[lxy@hecs-165234 linux5]# ./myproc
普通用户
下面使用 root 用户。
[root@hecs-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;
}
下面传入参数打印。
[lxy@hecs-165234 linux5]$ ./myproc -a -b -c -d
argv[0]: ./myproc
argv[1]: -a
argv[2]: -b
argv[3]: -c
argv[4]: -d
那么下面我们也就直接打印一下我们的 env 环境变量。
[lxy@hecs-165234 linux5]$ ./myproc
env[0]: XDG_SESSION_ID=6739
env[1]: HOSTNAME=hecs-165234
env[2]: TERM=xterm
env[3]: SHELL=/bin/bash
env[4]: HISTSIZE=10000
env[5]: SSH_CLIENT=123.139.60.208 35357 22
env[6]: SSH_TTY=/dev/pts/0
env[7]: USER=lxy
env[8]: LD_LIBRARY_PATH=:/home/lxy/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
env[9]: 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:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=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:*.jpg=01;35:*.jpeg=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:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=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:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;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]: LANG=en_US.UTF-8
env[14]: HISTCONTROL=ignoredups
env[15]: SHLVL=1
env[16]: HOME=/home/lxy
env[17]: LOGNAME=lxy
env[18]: SSH_CONNECTION=123.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 帮我们创建,所以我们的所有的子进程都是可以有环境变量。
其实我们的环境变量还是可以修改的,我们看一下。
修改环境变量
我们现在想自己定义一个属于我们自己的环境变量,那么该怎么办呢?
[lxy@hecs-165234 linux5]$ MYVALUE=10001
我们上面这样可以吗?
实际上是不可以的,这样定义的话实际上是“本地变量”。
我们查看一下是查不到的。
[lxy@hecs-165234 linux5]$ env | grep MVALUE
[lxy@hecs-165234 linux5]$
那么我们的环境变量怎么定义。
[lxy@hecs-165234 linux5]$ export MYVALUE
[lxy@hecs-165234 linux5]$ env | grep MYVALUE
MYVALUE=10001
我们可以将本地变量前面加一个 export 就可以变为环境变量。
那么怎么删除呢?
[lxy@hecs-165234 linux5]$ unset MYVALUE
[lxy@hecs-165234 linux5]$ env | grep MYVALUE
[lxy@hecs-165234 linux5]$
环境变量总结
-
全局性
-
动态
-
持久
-
可修改
其实不仅仅有这些特性,还有一些,想了解的可以查一下。
本地变量 & 内建命令
最后一个话题,我们前面提到的本地变量和内建命令。
查看本地变量
set命令:
这里为了方便知道我们查到的是本地变量,我们可以先定义一个本地变量的值。
[lxy@hecs-165234 linux5]$ MYVALUE=10000
[lxy@hecs-165234 linux5]$ set | grep MYVALUE
MYVALUE=10000
下面我们看一下本地变量有一些什么。
由于太多我们只挑几个看一下。
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
我们这三个,实际上就是本地变量,其中 PS1 就是表示命令行解释器的提示符 我们的普通用户就是 $
而下面的 > 就是还可以输入命令
[lxy@hecs-165234 linux5]$ ls \
> -a\
> -d\
>
本地变量其实只会在本BASH中有效。
内建命令
我们现在来看一个操作。
[lxy@hecs-165234 linux5]$ MYVALUE=19999
[lxy@hecs-165234 linux5]$ echo $MYVALUE
19999
我们前面不是说,我们的这些指令实际上就是程序吗,那么我们的程序就是 bash 创建子进程来的,但是我们的 MYVALUE 是一个本地变量,本地变量子进程不是不会继承吗?那么echo是怎么样显示出来的?
这里就要纠正之前的一个说法了,其实我们的指令,不一定bash会创建子进程,如果是一些比较安全的指令,那么还是bash自己执行的。
所以我们的命令实际上是由两种:
-
常规命令:bash创建子进程执行。
-
内建命令:bash亲自执行,自己调用函数。
还有一个内建命令,比如 cd
下面我们写一个代码来看一下cd命令
首先介绍一个函数
SYNOPSIS
#include <unistd.h>
int chdir(const char *path);
DESCRIPTION
chdir() 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;
}
我们在休眠的过程中查看我们的该进程的路劲,然后休眠后在查看我们的路劲。
[lxy@hecs-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 -> /
这里看到我们确实修改成功。