Nowcoder专项练习:Linux(四)

    xiaoxiao2025-12-05  27

    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中的一个进程!


    最新回复(0)