Linux复习知识

二、常用 Shell 命令

  1. 理解 Linux 操作系统“一切皆文件”的思想:
    因为linux将文件作为一切可用资源的使用接口.“一切资源”包括内存、磁盘、其他各种设备、进程间的通信,还有网络通信。这是一种简化的思想,把一切资源都简化为文件展示出来,将这些对资源的操作简化为对文件的操作。
  2. 掌握常用的文件处理命令,包括 ls、cd、pwd、touch、mkdir、cp、mv、
    rm
    文件处理命令:ls(在windows下使用dir来显示目录文件,表示directory)
    命令名称ls
    英文愿意:list
    命令所在路径:/bin/ls (在Linux下,命令存放的位置的不同,决定了该命令的执行权限的不同)
    执行权限:所有用户
    功能:显示目录或文件
    语法:ls 选项[-ald][文件或目录(参数)]
    -a(all)显示所有文件,包括隐藏文件,如果只是ls,就看不到隐藏文件
    -l(long)详细信息显示
    -d(directory)查看单独一个目录的详细信息

drwxr-xr-x 2 root root 4096 12-01 20.52 bin
----------------------drwxr-xr-x:(永远都是10个字符,不够得用-表示)
第一个字符:d是文件类型,常见的文件类型有三种,
d 表示目录

  • 表示“二进制文件”-rw-r-r,上面讲过,Linux下所有不是目录和特殊文件的,都可以称为二进制文件
    l 表示软链接文件 link
    (还有s开头的,等等,这些是特殊文件,我们以后再学)

以后的9个字符rwxr-xr-x,表示权限,
r:read 读权限
w: write 写权限
x:execute 执行权限(windows下的.exe文件就是这个意思,表示可以执行文件)
我们可以将其每三个拆为一组:rwx r-x r-x
每一组对应一种用户,
第一组:文件拥有者u user或onwer 比如张三创建了这个文件,这个文件的所有者就是张三,当然所有者是可以转让的,
第二组:所属组g(group) 组内(文件也可以放在组内)用户所具备对该文件的操作权限
第三组:其他人o(others)
--------------2 表示硬链接数
root root 两个root,第一个表示这个目录的所有者是谁,第二个root表示该目录的所属组
时间 文件创建的时间或者是文件最后修改时间

文件处理命令:cd
命令原意:change directory
命令所在路径:shell内置命令
执行权限:所有用户
语法:cd [目录] 中间有空格
功能:切换目录
例:$cd / 切换到根目录 $cd …回到上一级目录 . 代表当前目录

文件处理命令:pwd
命令原意: print working directory
功能:查看当前所在的目录

文件处理命令:mkdir
原意:make directories
所在路径:/bin/mkdir
执行权限:所有用户
语法:mkdir [目录名]
功能:创建一个目录
例:mkdir /test
mkdir -p /test/parent/son
-p表示如果没有父目录,则帮忙创建父目录

文件处理命令:touch
命令所在路径:/bin/touch
执行权限:所有用户
语法:touch [文件名]
功能:创建一个空文件
存在的话相当于改变修改时间

文件处理命令:cp
英文愿意:copy
命令所在路径:/bin/cp
执行权限:所有用户
语法:cp -r[源文件或目录][目的目录] 源文件可以同时是多个,即同时复制到多个文件
-r 复制目录

功能:复制文件或目录
例:cp /etc/inittab /etc/services /test/ 表示同时将etc/inittab文件和etc/下的services复制到/test目录下,**********目标可以不指定其文件名称
注意:如果只是复制文件,只要直接写上cp即可,但是复制目录的时候,一定要加上-r这个选项
cp -r /etc /test 表示将/etc目录复制到/test目录下,即test目录下有一个etc目录
(注意:etc目录下存放的都是一些配置文件,所以大多数都要将etc目录备份一下,最简单的备份方式就是copy到其他位置了,可以是分区,可以是硬盘)

文件处理命令:mv
英文原意:move
命令所在路径:/bin/mv
执行权限:所有用户
语法:mv [源文件或目录] [目录目录]
功能:移动文件目录(即剪切),也可以重命名目录或文件, *****************Linux没有rename这个命令
例:mv file1 file3
将当前目录下文件file1更名为file3
mv file2 dir2
将文件file2移动到目录dir2下
比如:mv services service将当前目录下的services更名为service ******如果移动后不改变名称,则可以不写目标文件名称,直接写目录,和
mv /test/inittab /tmp/ copy一样,也可以同时移动多个文件
将test/inittab文件移动到/tmp/目录下

文件处理命令:rm
原意:remove
所在路径:/bin/rm
执行权限:所有用户
语法:rm [文件或目录]
-r(选项) 递归删除目录(递归即深度到所有的子目录下) 如果要删除一个文件,则不需加任何的选项
功能:删除文件 在用这种方式删除一个文件时,系统会提示是否确认删除,此时需要敲入y,(实际上rm命令在Unit下,是直接删除文件的,但是Linux下,有别名机制,也就是rm也捆绑了一个选项,即-i,它会有一个询问过程)但是我们可以使用rm -f file3 直接将文件删除,而不需要系统提示确认删除例:rm file3 删除文件file3
rm -r dir1 删除目录dir1 rm -r test 删除目录test 在使用这种方式删除一个目录的时候,系统会提示你是否进入该目录,然后再帮你一个一个删除,如果目录里有很多文件时,这种方式也不可取的,所以如果你非常确定要删除该目录,可以使用 rm -rf test 强制删除(f 表示never prompt,从不询问),而cp -rf /etc /test/etc.back 表示复制目录/etc,并且如果目录里的文件无法打开,则强制打开,并复制

文件处理命令:rmdir
表示删除“空目录”。注意,是空目录,这个命令用得很少,因为他是用来删除空目录的

扫描二维码关注公众号,回复: 12276071 查看本文章
  1. 掌握常用文件查看命令 cat、more、head、tail
    Cat:cat 是由“第一行到最后一行连续显示在屏幕上”
    cat a.txt :查看a.txt文件的内容。
    cat -n a.txt :查看a.txt文件的内容,并且由1开始对所有输出行进行编号。
    cat -b a.txt :查看a.txt文件的内容,用法与-n相似,只不过对于空白行不编号

More:more命令以一页一页的形式显示,更方便使用者逐页阅读。按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,输入/+字符串可以搜索字符串(与vi搜索类似)
more +2 a.txt:从第二行开始显示a.txt文档的内容

Head:head命令用于显示文件文字区块。
head -n 5 a.txt : 显示a.txt的前5行
head -c 5 a.txt : 显示a.txt的前5个字节

tail:tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容
tail -f a.txt : 查看a.txt文件的尾部内容(默认10行,相当于增加参数 -n 10)
tail -n 20 a.txt: 查看a.txt最后20行。
tail -r -n 10 a.txt: 查看a.txt最后10行。

  1. 掌握常用文件搜索命令 which、find、locate、grep;理解 locate 和 find的区别与联系;
    find:find命令是直接在硬盘中进行搜索的
    在目录中查找指定文件
    -name:按照文件名搜索;在Windows搜索中,只要文件名包含init就会被搜索出来,但在Linux中,find命令是完全匹配的,必须和搜索关键字一模一样才会列出,是一种精确搜索;

locate:locate 命令相比find命令而言,那就是搜索速度非常快,而且耗费系统资源非常小。这是因为 locate命令不会直接搜索硬盘空间,而会先建立 locate 数据库,然后在数据库中按照文件名进行搜索,是快速查找的搜索命令。
在文件资料库查找文件
locate不是精准匹配 模糊

在使用查找配置文件位置时,发现locate开始返回是空,因为没有更新数据库
locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
locate 的速度比 find 快,locate是查数据库,所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库 ,命令为:updatedb

which命令:列出命令的所在路径
[root@root ~]# which cp
alias cp=‘cp -i’
/bin/cp

grep命令:在文件中搜索匹配的行输出
-i(忽略大、小写) -v(排除输出)
grep multiuser /etc/inittab

  1. 理解和掌握常用的权限管理命令,包括 chmod、chown、chgrp 等
    chown:可以改变文件(目录)的属主

chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格
分开的要改变权限的文件列表,支持通配符。
该命令的各选项含义如下:
- R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
- v 显示chown命令所做的工作。

chgrp: 可以改变文件(目录)的属组
该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。该命令的选项含义为: - R 递归式地改变指定目录及其下的所有子目录和文件的属组。
例1:$ chgrp - R book /opt/local /book 改变/opt/local /book/及其子目录下的所有文件的属组为book。
chmod : 可以修改文件(目录)的权限
u:属主
g:属组
o:其他人
a:所有人
+增加权限,-代表减少权限,=代表给定权限

  1. 熟悉网络管理与通信命令 ifconfig、netstat、ping、write、wall;
    ifconfig
    语法
    ifconfig 网卡名称 IP地址
    用途:查看和设置网卡信息

netstat打印网络连接、路由表、接口统计、伪装连接和多播成员关系

ping 选项 IP地址
-c 指定发送次数
用途:测试网络连通性

write
语法
write <用户名>
用途:给用户发信息,以ctrl+D保存结束

wall
wall [message]
用途:发广播信息

  1. 熟练掌握压缩解压命令 gzip/gunzip、zip/unzip、bzip2/bunip2、tar等;
    gzip (不能压缩目录,只能压缩文件 )

命令名称: gzip

所在路径: /bin/gzip

执行权限: 所有用户

功能描述: 压缩文件,gzip压缩和解压后原文件都删除了

压缩后文件格式: .gz

gunzip (解压缩后压缩包删除)
命令名称: gunzip
英文原意: GUN unzip
所在路径: /bin/gunzip
执行权限: 所有用户
功能描述: 解压缩.gz的压缩文件

tar
命令名称: tar
所在路径: /bin/tar
功能描述: 打包目录或文件
压缩后文件格式: .tar.gz
语法: tar 选项[-zcf] [压缩后的文件名] [目录\文件]
-c 打包
-v 显示详细信息
-f 指定文件名
-z gz格式
-j bz2格式
范例: tar -zcvf 1.tar.gz 1.txt

tar命令解压缩语法:
-x 解包
-v 显示详细信息
-f 指定解压文件
-z gz格式
-j bz2格式
范例: tar -xzvf 1.tar.gz

zip (压缩后原文件存在 )
命令名称: zip
所在路径: /usr/bin/zip
执行权限: 所有用户
功能描述: 压缩文件或目录
压缩后文件格式: .zip
语法: zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
unzip (zip的解压缩命令,解压缩不分目录和文件)

bzip2
命令名称: bzip2
所在路径: /usr/bin/bzip2
执行权限: 所有用户
功能描述: gzip的升级版本,可以保留原文件
压缩后文件格式: .bz2
-k 解压缩后保留原文件
tar -jcf 1.tar.bz2 1.txt (打包并压缩)

bunzip2
命令名称: bunzip2
所在路径: /usr/bin/bunzip2
执行用户: 所有用户
功能描述: 解压缩
语法: bunzip2 选项[-k] [压缩文件]
-k 解压缩后保留原文件
tar -jxf 1.tar.bz2 (解包解压缩)

  1. 掌握常用帮助命令 man、info、whatis、whoami

三、常用开发工具

  1. 理解 VI/VIM 编辑器三种工作模式及切换方法
    命令模式(Command mode)、插入模式(Insert mode)、底行模式(Lastline mode)
    插入->命令:esc
    <- a i o
    命令模式->底行模式 : / 切换到底线命令模式,以在最底一行输入命令
    <- 自动切换

  2. 理解 VI/VIM 编辑器在命令模式下光标移动的六个层次 (PPT第2章)
    命令模式下,光标移动可以分为:字符级,单词级,行级,段落级,屏幕级,文档级

  3. 掌握 VI 编辑器地行模式下进行设置和取消行号、移动光标、文件中查找的方法;(PPT 第二章2.2.1)
    末行模式下 set number设置行号 set nonumber
    移动行 末行模式下直接输入行号
    查找:1、命令模式下输入“/字符串”,例如“/Section 3”。 2、如果查找下一个,按“n”即可。

  4. 了解 GCC 编译流程以及 GCC 编译工具的使用方法;(2.1.2)
    预处理: 展开宏定义 将include包含的文件插入对应的位置,删除注释,添加行号和标识
    编译阶段,gcc会对经过预处理的文件进行语法,词法,语义分析,生成相应的汇编代码文件
    汇编过程,将编译后的汇编代码转化成机器可以执行的命令—二进制命令
    连接过程,组装各个目标文件的过程,会解决符号依赖和库依赖关系,最终生成可执行文件

• 1.预处理后的hello ->hello.i:
• 2.编译 hello.c ->hello.s
• 3.汇编 hello.c -> hello.o
• 4.链接 hello.c -> hello
预处理,编译,汇编,链接
预处理 -E 编译 -S 汇编 -o 连接
5. 掌握 GDB 调试工具的使用方法(2.1.3)
gdb调试中常用的命令
l 看源码 r 运行 break n 在第n行设置断点 n 单条语句执行 p 打印变量 finish 当前函数完成返回

  1. 掌握多文件项目 Makefile 的编写方法
    all:kmeans
    kmeans:main.o function.o
    g++ -o kmeans main.o function.o
    main.o:main.cpp
    g++ -c main.cpp
    function.o:function.cpp
    g++ -c function.cpp
    clean:
    rm -f *.o

四、用户与用户组管理

  1. 理解下列概念:用户、文件所有者、用户组、文件所属组、其他用户、root 用户;
    用户(user)的概念;
    普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限
    用户组(group)的概念;
    用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、 修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限 ,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文 件的权限来实现的;
    文件的所有者就是这个文件的建立者,也可以通过chown来改变文件所有者
    所属组:组很明显不止一个人,是多个人一起的。我们电脑上有一些开发手册,这些手册是给我们的开发组看的,所以我们这开发组的几个成员都可以自己查看这些开发手册
    其他人:既不属于所有者,也不属于所属组之外的成员,就可以理解为其他人
    超级用户:拥有对系统的最高管理权限,默认是root用户

  2. 掌握用户和用户组管理命令:账号的添加、修改和删除;用户组的添 加、删除,用户组属性修改
    账户添加:
    #1 useradd命令 -u  指定用户ID -m 自动建立用户的登入目录 -r  建立系统帐号。

账户修改
对于系统中已经存在的用户账号,可以使用usermod命令重新设置各种属性。usermod命令同样需要指定账号名称作为参数。
命令使用基本格式
usermod [选项] 用户名
常用选项
-u:修改用户的 UID 号。
-d:修改用户的宿主目录位置。

删除
userdel 命令——删除用户账号
当操作系统中的某个用户账号不再使用时(如该员工已经从公司离职等情况),可以使用 userdel 命令将该用户账号删除。
命令使用基本格式
userdel [选项] 用户名
常用选项
-r 同时删除宿主目录

组添加
#2 groupadd命令 -r:创建系统工作组
再使用chown chmod修改文件对应的属主和属组,以及访问权限

修改
gpasswd 命令——添加、删除组成员
gpasswd 命令本来是用于设置组账号的密码,但是该功能极少使用,实际上该命令更多地用来管理组账号的用户成员。
命令使用基本格式
groupadd [选项] 用户名 组名
-a 添加组成员
-d 删除组成员

删除
groupdel 命令——删除组账号
当系统中的某个组账号已经不再使用时,可以使用 groupdel 命令将该组账号删除。而添加指定的组账号名称作为参数。
命令使用基本格式
groupdel 组名

修改用户组
chgrp www lifang
第一个参数 要改变的组
第二个参数 要改变的文件或文件夹

  1. 用户组切换
    如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。
    newgrp 用户组名称

五、Shell 编程:

  1. 熟练掌握重定向、管道和命令连接符
    标准输入文件的编号0 标准输出文件编号1 标准错误文件编号2
    输出重定向
    命令 1> 文件名 命令 > 文件名

代表以覆盖的方式将命令的正确输出输出到指定的文件或设备当中。

代表以追加方式将结果打印到文件中。

错误重定向
命令 2> 文件名
2代表标准错误文件的编号
使用运算符 & 通过文件编号引用文件,该运算符表示“等同于”, 2>&1 :将标准错误重定向到标准输出中

输入重定向
命令 < 文件名 命令 0< 文件名:把文件作为命令的输入
1.命令 >> 文件 2>>&1 :以追加的方式,把正确输出和错误输出都保存在文件中。
2.命令&>文件名:以覆盖的方式将正确和错误输出都保存在文件中。
3.命令&>>文件名:以追加的方式将正确和错误输出都保存在文件中。
命令 >> 文件 2>&1 和 命令 &>>文件作用相同
4.命令>>文件A 2>>文件B:正确的输出到A文件中,错误的输出到B文件中

管道符
用来连接两个命令
命令格式:命令A|命令B,即命令1的正确 输出 作为命令B的操作对象。

命令连接符
1、竖线
‘|’ ,在linux中作为管道符,将’|‘前面命令的输出作为’|'后面的输入
2、双竖线 短路或
‘||’,用双竖线’||'分割的多条命令,代表的是或者
执行的时候遵循如下规则,如果前一条命令为假,则继续执行后面的命令,如果前一条命令为真,则后面的命令不会执行。
比如:输入1小于2双竖线输出b,前面为真,后面不执行则没有输出b,输入1大于2双竖线echo b,前面为假则输出b。
3、&& 短路且
可同时执行多条命令,代表的是且,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。
4、&
同时执行多条命令,不管命令是否执行成功

  1. 掌握 Shell 变量的定义和使用方法
    变量类型:
    系统环境变量
    自定义变量
    特殊符号变量

定义变量的方式有三种:
variable=value
variable=‘value’
variable=“value”
variable是变量名,value是赋给变量的值
如果value不包含任何空白符(例如空格、Tab等),那么可以不使用引号;如果value包含了空白符,就必须用引号包围起来

1.单小括号代表命令组,双小括号代表着可以整数运算
2.使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中

测试条件:
-a: and
-o: or
!: 非
字符串
== 等于 两边要有空格 != 不等
整数

语法:
((表达式1,表达式2…))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开

$() 等同于: ··(反引号):运行一段命令
$(()) 进行数字运算
#a=3;b=2;c=5
#echo $((a+b*c))

$[] $(()) :
它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

注意:
1.=周围不能有空格
2.shell中变量没有数据类型 任何类型它都默认为字符串
#双分支if条件语句

if [ 条件判断式 ]
then
条件成立时,执行的语句
else
条件不成立时,执行另外一段语句
fi

if [[ ${x} -ge y ] ] ; t h e n e c h o " {y} ]]; then echo " y]];thenecho"{x} -ge y : x 大 于 或 等 于 y " e l s e e c h o " {y}: x 大于或等于 y" else echo " y:xy"elseecho"{x} -ge ${y}: x 小于 y"
fi

  1. 掌握 Shell 中的语句与循环

while [[ condition ]]
do

语句

done

  1. 掌握 Shell 函数的构造和使用方法
    function_name ()
    {
    statement1
    statement2

    statementn
    }

function_name parm1 parm2

  1. 掌握 Shell 脚本的调试方法
    博客地址

六、Linux 文件系统与操作

  1. 了解磁盘分区和目录结构
    磁盘上的盘片被细分为多个大小相同的扇区,扇区是磁盘空间的基本单位
    磁盘的第一个扇区非常重要,存储了:主引导记录(开机时,只有MBR中程序正确才开机),磁盘分区表(记录每个分区的状态),魔数
    目录结构:
    是磁盘等存储设备上文件的组织形式,主要体现在对文件和目录的组织方式上
    /etc: 这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
    /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
    值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
    /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。
    /mut: 存储挂载存储设备的挂载目录

  2. 理解虚拟文件系统;VFS
    系统中 “一切皆文件” 概念的基础 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
    为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的接口和数据结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

  3. 掌握 ext2/ext3 文件系统布局;
    ext3完全兼容ext2文件系统的日志文件系统,在ext2基础上增加了一个被称为日志的块,专门记录写入或修订文件时的步骤

  4. 数据块寻址
    Linux中文件的属性信息和数据分开存放,系统通过文件inode的索引项Block查找文件数据
    Block[0]~[11]直接索引 [12]间接索引 [13]二级间接索引 [14] 三级间接索引

  5. 文件类型
    ls -l打印文件属性信息中的第一个字符代表文件类型,有7个值
    d:目录文件 directory
    l:符号链接文件 link
    s:套接字文件 socket
    b:块文件 block
    c:字符设备文件 character
    p:管道文件 pile
    -:普通文件
    有四种文件:普通文件,目录文件,设备文件(b c),特殊文件(p s l)

  6. 掌握 Linux 系统中实现 I/O 操作的方法,理解文件描述符,文件操作系统调用中常用的宏定义
    文件描述符:
    实质是一个索引值,存储于由内核维护的该进程打开的文件描述符表中
    存在于进程的文件描述符是进程级别
    当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
    文件I/O:
    open() read() write() lseek()修改读写位置 close()
    O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 O_CREAT 创建并打开 O_APPEND 追加

七、进程管理

  1. 掌握 Linux 系统进程属性和处理机制
    计算机采用多道程序设计:计算机允许多个相互独立的程序同时进入内存,在内核管理控制之下相互穿插的运行
    进程的属性保存在一个PCB中,内核为每个进程维护了一个PCB,用于管理相应进程的属性信息
    PCB包括 进程控制符 进程组 进程环境 进程运行状态
    进程状态:初始态 就绪态 运行态 睡眠态 终止态

  2. 创建进程 — 读时共享,写时复制
    在fork后,创建的子程序可访问父进程的数据空间,若子进程对这些数据修改,则内核会把这些修改数据复制到子进程的地址空间
    exec函数族中的函数可以根据指定的文件名或路径找到可执行文件,用该文件取代调用该函数的进程中的程序,再从文件的main函数开始,执行文件的内容
    execl execlp execle execv execvp execve 所有的参数最后必须以NULL结尾

进程退出
_exit()无条件的停止
exit()对_exit()进行了包装,执行前检查了文件打开情况,将缓冲区内容写入
僵尸进程 调用exit后,该进程不会马上退出,而是会留下一个僵尸进程的数据结构,记载进程的退出状态,供父进程收集
可以通过wait waitpid有效的防止僵尸进程的产生,对于内存中已经有的,可以杀死其父进程,使得其被init接受,init不断调用wait来获取子进程状态

  1. 实现同步
    wait(int *status) 使用wait的进程会被挂起,直到捕获到子进程的退出信息 status保存子进程退出状态
    waitpid(pid ststus) pid>0 等待该pid的进程结束
    -1 与wait相同,等待一个子进程
    0 等待索引所有子进程
    <-1 等待指定进程组|pid|中的子进程

  2. 进程管理命令
    ps 可以查看系统当前正在运行的进程 -r只列出正在执行的进程
    top 可以实时观察系统整体运行情况
    pstree 以树状图形式显示系统进程
    pgrep 根据进程名,从近处队列中查找进程,查找成功后显示pid
    mice -n 设置进程的优先级
    jobs 可以查看作业列表和作业状态 显示作业编号,状态,启动作业的命令

八、信号

  1. 信号分类与产生方式
    1-31 常规信号 34-64 实时信号
    信号来源: 组合按键
    系统检查硬件异常
    满足某种软件条件 alarm计时器结束
    系统调用kill raise abort
    终端kill
    信号处理三种方式:忽略SIG_IGN 但SIG_KILL SIGSTOP不可被忽略
    捕捉
    执行默认动作SIG_DFL

  2. 系统调用产生进程
    kill(pid sig) 给pid 发送信号
    abort 发送一次终止信号SIGABRT,终止进程生成core文件
    pause 进程主动挂起,等待信号唤醒
    alarm 计时器 指定描述后发送信号

  3. 信号捕获
    signal(信号编号 处理) signal(SIGALRM,sigalrm_fn);
    sigacton结构体

九、进程通信

  1. 进程通信
    管道通信:实质是内核管理的缓冲区
    进程中创建的是匿名管道 — 有亲缘的进程通信
    int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno
    int fd[2]; int status = pipe(fd);
    函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区 close(fd[1]); // 关闭写的通道
    匿名管道利用fork机制建立联系,刚创建的管道读写两端都链接在一个进程上,当进程中调用fork后,父子进程共享文件描述符,所有子进程拥有和父进程相同的管道,有两个指向管道文件的文件描述符,实现通信实质是关闭多个进程中多余的文件描述符,只为待通信的进程各自保留读端或写端
    读取数据没有时会被阻塞

命名管道 – 文件 进程退出后任然存在
命名管道和系统中的一个路径名关联int ret=mkfifo(PATH_NAME,S_IFIFO|0666);
S_IFIFO 即表示有名管道文件

信号量
semget(key3,2,IPC_CREAT | 0666) 创建信号量
消息队列
可以实现无亲缘关系的进程通信
msgget()创建
int msgget(key_t key, int msgflg); 例:msgget(key,IPC_CREAT|0666)
msgflg:消息队列的建立标志和存取权限。IPC_CREAT如果内核中没有此队列,则创建它。
msgsnd() 像消息队列发消息 msgrev() 从消息队列中读取信息,读取的信息消失
msgctl(msgid1,IPC_RMID,NULL) 删除
共享内存
共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
创建共享内存shmget(key_n,1024,0666|IPC_CREAT))==-1
shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间,shmat(shm_id,0,0)
删除shmctl(shm_id,IPC_RMID,0)
socket通信

头文件

#include<sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/stat.h> 
#include <sys/wait.h>

其他

virtual box三种网络模式
桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信
NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网
Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯

猜你喜欢

转载自blog.csdn.net/qq_43779658/article/details/111829506
今日推荐