Linux下进程的特点与环境变量

目录

进程的特点

进程特点的介绍

进程时如何实现并发性的

进程间如何切换

概念铺设

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);
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;
}

我们在休眠的过程中查看我们的该进程的路劲,然后休眠后在查看我们的路劲。

[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 -> /

这里看到我们确实修改成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 项目使用 Redis 对用户 IP 进行接口限流

一、思路 使用接口限流的主要目的在于提高系统的稳定性&#xff0c;防止接口被恶意打击&#xff08;短时间内大量请求&#xff09;。 比如要求某接口在1分钟内请求次数不超过1000次&#xff0c;那么应该如何设计代码呢&#xff1f; 下面讲两种思路&#xff0c;如果想看代码可…

MySql用户管理、权限管理

用户管理 1. 查看系统用户&#xff08;查询mysql系统数据库中的user表&#xff09; select * from mysql.user; 2. 创建用户 CREATE USER 用户名主机名 identified by 密码 -- 创建用户zhonghua,只能在当前主句localhost访问,密码为123456 create user zhonghualocalhost i…

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

MySQL 查询语句大全

目录 基础查询 直接查询 AS起别名 去重&#xff08;复&#xff09;查询 条件查询 算术运算符查询 逻辑运算符查询 正则表达式查询⭐ 模糊查询 范围查询 是否非空判断查询 排序查询 限制查询&#xff08;分页查询&#xff09; 随机查询 分组查询 HAVING 高级查询…

EtherCAT转EtherCAT网关FX5U有EtherCAT功能吗两个ETHERCAT设备互联

1.1 产品功能 捷米JM-ECT-ECT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 1.2 技术参数 1.2.1 捷米JM-ECT-ECT技术参数 ● 网关做为ETHERCAT网络的从站&#xff0c;可以连接倍福、…

小型双轮差速底盘机器人实现红外跟随功能

1. 功能说明 本文示例将实现R023样机小型双轮差速底盘跟随人移动的功能。在小型双轮差速底盘前方按下图所示安装3个 近红外传感器&#xff0c;制作一个红外线发射源&#xff0c;实现当红外发射源在机器人的检测范围内任意放置或移动时&#xff0c;机器人能追踪该发射源。 2. 电…

抖音seo矩阵系统源码搭建开发详解

抖音SEO矩阵系统是一个用于提高抖音视频在搜索引擎排名的工具。如果你想开发自己的抖音SEO矩阵系统&#xff0c;以下是详细的步骤&#xff1a; 开发步骤详解&#xff1a; 确定你需要的功能和算法 抖音SEO矩阵系统包含很多功能&#xff0c;比如关键词研究、内容优化、链接建设、…

PHP8的跳转语句-PHP8知识详解

如果循环条件满足的时候&#xff0c;则程序会一直执行下去。如果需要强制跳出循环&#xff0c;则需要使用跳转语句来完成。PHP8的跳转语句包括break语句、continue语句和goto语句。 1、break语句 break语句的作用是完全终止循环&#xff0c;包括while、do…while、for、switch…

6. CSS(三)

目录 一、盒子模型 &#xff08;一&#xff09;网页布局的本质 &#xff08;二&#xff09;盒子模型组成 &#xff08;三&#xff09;边框&#xff08;border&#xff09; &#xff08;四&#xff09;表格的细线边框 &#xff08;五&#xff09;内边距&#xff08;padding…

[JavaScript游戏开发] 绘制Q版地图、键盘上下左右地图场景切换

系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示) 第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测 第四章 绘制Q版地图、键盘上下左右地图场景切换 文章目录 系列文章目录前言一、本章节…

【TypeScript】类型断言-类型的声明和转换(五)

【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09; 【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09;一、简介二、断言形式2.1 尖括号语法2.2 as形式 三、断言类型3.1 非空断言3.2 肯定断言-肯定化保证赋值3.3 将任何类型断言为any3.4 调…

Django实现音乐网站 ⑹

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是在添加编辑过程中对后台歌手功能优化及表模型名称修改、模型继承内容。 目录 表模型名称修改 模型继承 创建抽象基类 其他模型继承 更新表结构 歌手新增、编辑优化 表字段名称修改 隐藏单曲数和专辑数 姓…

Leetcode周赛 | 2023-8-6

2023-8-6 题1体会我的代码 题2我的超时代码题目体会我的代码 题3体会我的代码 题1 体会 这道题完全就是唬人&#xff0c;只要想明白了&#xff0c;只要有两个连续的数的和&#xff0c;大于target&#xff0c;那么一定可以&#xff0c;两边一次切一个就好了。 我的代码 题2 我…

eNSP 路由器启动时一直显示 # 号的解决办法

文章目录 1 问题截图2 解决办法2.1 办法一&#xff1a;排除防火墙原因导致 3 验证是否成功 1 问题截图 路由器命令行一直显示 # 号&#xff0c;如下图 2 解决办法 2.1 办法一&#xff1a;排除防火墙原因导致 排查是否因为系统防火墙原因导致。放行与 eNSP 和 virtualbox 相…

专业的ADAS测试记录仪ETHOS

随着ADAS驾驶辅助系统技术的快速发展及日臻成熟&#xff0c;近年来ADAS在全球汽车市场已开始快速普及和商业化&#xff0c;而如何确保ADAS系统的可靠和安全俨然成为汽车领域的重要问题。因此&#xff0c;ADAS驾驶辅助系统的测试也成为了各大整车厂及零部件厂商所关注的焦点。 一…

区块链实验室(14) - 编译FISCO-BCOS

FISCO-BCOS是一种区块链平台&#xff0c;与Hyperledger和Ethereum有些不同&#xff0c;详见FISCO BCOS 区块链 编译FISCO BCOS源码的目的是修改或者新增其中功能模块&#xff0c;进行对比实验&#xff0c;验证新想法、新创意的效果。编译的步骤很简单&#xff0c;按技术文档一…

0805hw

1. #include <myhead.h> void Bub_sort(int *arr,int n)//冒泡排序 {for(int i1;i<n;i){int count0;for(int j0;j<n-i;j){if(arr[j]>arr[j1]){int temparr[j];arr[j]arr[j1];arr[j1]temp;count;}}if(count0){break;}}printf("冒泡排序后输出结果:\n"…

Jmeter +Maven+jenkins 接口性能全自动化测试

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…

Linux6.36 Kubernetes Pod进阶

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes Pod进阶一、资源限制1.CPU 资源单位2.内存 资源单位3.重启策略&#xff08;restartPolicy&#xff09;4.健康检查&#xff1a;又称为探针&#xff08;Probe&#xff09;5.启动、退出动作 计算机系统 5G云计算 第三章 LIN…

标准的OSI七层模型(其实了解tcp足矣)

七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般称为OSI参考模型或七层模型。 它是一个七层的、抽象的模型体&#x…