1,报文命令分析
subnet 166.173.197.131 netmask 255.255.255.192{
range 166.173.197.10 166.173.197.107;
default-lease-time 600;
max-lease-time 7200;
}
以上报文表示,
对子网166.173.197.131(其子网掩码为255.255.255.192,即网络号占高26位,主机号占低6位),该子网的网络地址为:166.173.197.128,其主机范围为166.173.197.128-166.173.197.191.
现在对该可选择范围内申请主机号范围在166.173.197.10-166.173.197.107的IP地址;
该申请默认租用时间为600s,最大租用时间不超过7200秒
- subnet 设置一个子网
- range 可分配的IP地址范围
- default-lease-time 默认租用时间
- max-lease-time 最大租用时间
2,DISPLAY
Linux X Window System中X是一个开放的协议规范,当前版本为11,俗称X11。
X Window System由客户端和服务端组成,服务端X Server负责图形显示,而客户端库X Client根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server。
3,whereis
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。
但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。
1.命令格式:
whereis [-bmsu] [BMS 目录名 -f ] 文件名
2.命令功能:
whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。 这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。
3.命令参数:
-b 定位可执行文件。
-m 定位帮助文件。
-s 定位源代码文件。
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
-B 指定搜索可执行文件的路径。
-M 指定搜索帮助文件的路径。
-S 指定搜索源代码文件的路径。
另外几条命令含义:
- which 查看可执行文件的位置
- whatis 查询命令都有什么功能
- apropos 查询指定关键字的命令
4,压缩文件命令
如果我们需要将一个文件压缩成一个压缩包,需要将打包后的文件名放在前面。
Q:若要将当前目录中的myfile.txt文件压缩成myfile.txt.tar.gz,则实现的命令为?
A:tar –zcvf myfile.txt.tar.gz myfile.txt
其中:
- -c 建立压缩文件件
- -v 压缩的过程显示文件
- -f 使用档名
- -z 表示使用gzip压缩
- -j 表示使用bzip2压缩
- -x 表示解压缩
Q:将/home/stud1/wang目录做归档压缩,压缩后生成wang.tar.gz 文件,并将此文件保存到/home 目录下,实现此任务的tar 格式为?
A:tar zcvf /home/wang.tar.gz /home/stud1/wang
5,用户态到内核态
用户态到内核态一共有三种方式:
1,系统调用
2,异常
3,外围设备的中断
Q:下列选项中,会导致用户进程从用户态切换到内核的操作是?
I. 整数除以零
II. sin( )函数调用
III. read系统调用
A:在上面的三个选项中,I是属于异常,III是属于系统调用,因此是I和III。
6,网络连接不通问题
Q:在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连通,而不能与公网连通,问题可能是:
A. 主机IP设置有误
B. 没有设置连接局域网的网关
C. 局域网的网关或者主机的网关设置有误
D. 局域网DNS服务器设置有误
A:
对于A选项,错误,因为如果主机IP设置有误的话,内网也不会连通。
对于B选项,错误,因为若是没有连接局域网网关,局域网内也不会通。
对于C选项,正确。
对于D选项,DNS服务器设置有误,IP地址有可能是通的。
7,UNIX的目录结构
在UNIX中,目录结构采用带链接树形目录结构。
带链接树形目录结构又称非循环图目录结构,它是指访问一文件(或目录)可以有多条路径。一般常说UNIX的文件系统是树形结构,其实是指带链接的树形结构,而不是纯树形目录结构。
带链接树形目录结构
单级目录结构
二级目录结构
多级目录结构(树形目录结构)
8,替换命令
Q:使用sed命令, 将文件xyz中的单词AAA全部替换为BBB,命令应该是?
A:sed ‘s/AAA/BBB/g’ xyz
在上面这条指令中,s表示替换命令,/AAA表示匹配AAA,/BBB表示匹配BBB,/g表示在一行内全面替换,xyz表示替换文件的名称
需要注意的是,上面的这条命令并不会改变原文件的内容,而是把替换后的文件内容输出。如果想要改变原文件中的内容的话,可以使用如下的命令:
- sed ‘s/AAA/BBB/g’ xyz > xyz.tmp
即赋值xyz生成了一个新的文件xyz.tmp,并且里面的内容是被替换过的。
- g 表示行内全面替换
- p 表示打印行
- w 表示把行写入一个文件
- x 表示互换模板块中的文本和缓冲区中的文本
- y 表示把一个字符串翻译为另外的字符(但是不用于正则表达式)
- \1 字符串匹配标记
- & 已匹配字符串标记
9,Linux查阅文件内容
在Linux中,查阅全部文件内容的命令一共有三种:cat、more、less
- more命令:可以让屏幕在显示满一屏幕时,此时可按空格健继续显示下一个画面,或按 Q 键停止显示。
- less命令:可以分页显示文件,和more命令的区别就在于它支持上下键卷动屏幕,当结束浏览时,只要在less命令的提示符“:”下按Q即可。
- cat命令:主要有三大功能:
(1)一次显示整个文件: $ cat filename
(2)从键盘创建一个文件:$ cat > filename
(3)将几个文件合并为一个文件:$ cat file1 file2 > file
而对于ls命令而言,它是list的缩写,用来打印当前目录的清单,而不可以查阅文件的内容。
如果ls指定其他目录,那么就可以显示指定目录里的文件以及文件夹清单了。
10,赋值方法
一共有五种赋值方法:
- 直接赋值
其格式为:变量名 = 变量值 - 使用read命令
该命名是系统内置命令,语法格式为:read 变量1 变量2 - 使用命令行参数赋值
$ 命令 参数1 参数2 参数3 - 使用命令的输入结果赋值,例如,
currentdir = ‘pwd’
echo $currentdir - 从文件中读取数据,例如:
#!/bin/bash
ls *.sh >execfile
while read LINE
do
chmod a+x $LINE
done<execfile
11,user相关操作
- useradd: 增加用户
- usermod: 修改用户账户信息
- groupadd: 添加组账号
- userdel: 删除用户
12,ls引发的系统调用
首先,任何shell都会执行exec 和 fork
而对于ls而言,还会执行read
因此,ls所引发的系统调用为exec、fork、read。
13,子进程与父进程
在Linxu中,对于多进程而言:
子进程继承父进程的有:
- 用户号UIDs和用户组号GIDs
- 环境Environment
- 堆栈
- 共享内存
- 打开文件的描述符
- 执行时关闭(Close-on-exec)标志
- 信号(Signal)控制设定
- 进程组号
- 当前工作目录
- 根目录
- 文件方式创建屏蔽字
- 资源限制
- 控制终端
子进程独有的:
- 进程号PID
- 不同的父进程号
- 自己的文件描述符和目录流的拷贝
- 子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
- 不继承异步输入和输出
父进程和子进程拥有独立的地址空间和PID参数。
子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的文件描述符,堆栈,(共享)内存等。
经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。
事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。由于父进程的PCB和子进程的一样,所以在PCB中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词意味着“竞争”
14,显示特定行数的内容
Q:采取什么命令可以查看file1文件的第300-500行的内容?
A. cat file1 | tail -n +300 | head -n 200
B. cat file1| head -n 500 | tail -n +300
C. sed -n ‘300,500p’ file1
A:
正确的答案应该是B和C。
首先,对于head而言:
head -n k # 打印前k行
head -n -k # 打印除最后k行外的所有内容
对tail而言:
tail -n k # 打印最后k行
tail -n +k # 从k行开始打印
题目的要求是,输出300-500行的内容。
A选项:
从第300行开始,接着输出前200行的内容,但这里的200行包括了第300行,不包括第500行。
所以应该改为cat file1 | tail -n +300 | head -n 201。
B选项:先取出前500行,再从300行开始。 cat file1 | head -n 500 | tail -n + 300 ,正确。
C选项:sed命令 p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
sed -n ‘300-500p’ 打印300-500行,正确。
15,线程的补充知识
- 线程是进程的一个实体,一个进程包含多个线程,线程是CPU调度和分派的基本单位,是比进程更小的、能够独立运行的基本单位。
- 但是,线程不能够直接独立运行,必须依附于应用程序中,由应用程序提供多个线程控制。
- 进程有独立的地址空间,线程没有独立的空间,线程是共享进程的地址空间。
- 线程是程序的多个顺序的流态执行。
16,fork与缓冲机制
Q:下面的程序中一共输出多少个"-"?
int main(void)
{
int i;
for(i=0;i<2;i++){
fork();
printf("-");
}
return 0;
}
A:
printf是一个行缓冲函数,先写到缓冲区,满足条件后才将缓冲区刷新到对应文件中,刷新缓冲区的条件如下:
1)缓冲区填满;
2)写入的字符中有‘\n’、’\r’;
3)调用fflush手动刷新缓冲区;
4)调用scanf要从缓冲区读取数据时,也会将缓冲区内的数据刷新。
另外,当执行printf的进程或线程结束的时候,也会主动调用flush来刷新缓冲区。
本题中printf没有’\n’,是因为进程执行结束,才去刷新缓冲区,在屏幕上显示字符,这是理解本题的关键。
当i=1时,parent进程中printf的缓冲区内容为"–",第一个’-‘为i=0时printf的输出,只是没有’\n’而囤积到这一次。child2进程中printf缓冲区的第一个’-‘则是因为子进程会复制父进程的缓冲区,因此复制了parent的buf。
程序结束即所有进程都结束后,会自动刷新缓冲区,此时会一下子把parent,child2,child1和child1_2的缓冲区输出到显示屏幕上,输出的顺序可能会随机。因此最后共输出8个’-’。
17,管道机制
管道实际上是一种固定大小的缓冲区,管道对管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。
它类似于通信中的半双工信道的进程通信机制,一个管道只能保证一个一个方向上的数据传输,要实现双向数据传输必须使用两个管道
管道的容量大小通常为内存的一页,其容量受多方面因素影响,包括缓冲区的大小、磁盘容量大小等问题。
当管道满时,进程在写管道会被阻塞;
而当管道空时,进程在读管道会被阻塞。
因此,当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。进程对管道进行读操作和写操作都可能被阻塞。
管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息,管道可以同时进行读进程和写进程。
详细博客地址:
Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
18,fork相关问题
Q:
int main{
fork() || fork()
}
上面的代码,一共创建了多少个进程?
A:
fork()给子进程返回一个零值,给父进程返回一个非零值。
在main这个主进程中,首先执行 fork() || fork(),左边的fork()返回一个非零值,根据||的短路原则,前面的表达式为真时,后面的表达式不执行,故包含main的这个主进程创建了一个子进程。
由于子进程会复制父进程,而且子进程会根据其返回值继续执行,就是说,在子进程中, fork() ||fork()这条语句左边表达式的返回值是0,所以||右边的表达式要执行,这时在子进程中又创建了一个进程,
即main进程->子进程->子进程,一共创建了3个进程。
19,log
- /var/log/messages — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
- /var/log/dmesg — 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
- /var/log/auth.log — 包含系统授权信息,包括用户登录和使用的权限机制等。
- /var/log/boot.log — 包含系统启动时的日志。
- /var/log/daemon.log — 包含各种系统后台守护进程日志信息。
- /var/log/dpkg.log – 包括安装或dpkg命令清除软件包的日志。
- /var/log/kern.log – 包含内核产生的日志,有助于在定制内核时解决问题。
- /var/log/lastlog — 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
- /var/log/maillog /var/log/mail.log — 包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
- /var/log/user.log — 记录所有等级用户信息的日志。
- /var/log/Xorg.x.log — 来自X的日志信息。
- /var/log/alternatives.log – 更新替代信息都记录在这个文件中。
- /var/log/btmp – 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,”last -f /var/log/btmp | more“。
- /var/log/cups — 涉及所有打印信息的日志。
- /var/log/anaconda.log — 在安装Linux时,所有安装信息都储存在这个文件中。
- /var/log/yum.log — 包含使用yum安装的软件包信息。
- /var/log/cron — 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
- /var/log/secure — 包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
- /var/log/wtmp或/var/log/utmp — 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
- /var/log/faillog – 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。
- /var/log/httpd/或/var/log/apache2 — 包含服务器access_log和error_log信息。
- /var/log/lighttpd/ — 包含light HTTPD的access_log和error_log。
- /var/log/mail/ – 这个子目录包含邮件服务器的额外日志。
- /var/log/prelink/ — 包含.so文件被prelink修改的信息。
- /var/log/audit/ — 包含被 Linux audit daemon储存的信息。
- /var/log/samba/ – 包含由samba存储的信息。
- /var/log/sa/ — 包含每日由sysstat软件包收集的sar文件。
- /var/log/sssd/ – 用于守护进程安全服务
20,DVM
DVM指dalvik的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
总结起来一句话:
每一个DVM都是在Linux中的一个进程!