linuxbingc(练习题)

Posted 鸟随二月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linuxbingc(练习题)相关的知识,希望对你有一定的参考价值。

1.在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令?

A.grep -E #$ try_grep
B.grep -E #a try_grep
C.grep -E ^$ try_grep
D.grep -E ^a try_grep

答案解析
grep选项中,-E选项可以用来扩展选项为正则表达式;
$ 表示匹配文件末尾,字符需要在 之 前 表 示 以 字 符 结 尾 a 之前表示以字符结尾 a a表示以a结尾
^表示匹配文件起始,字符需要在之后表示以字符起始 ^a表示以a起始

2.批量删除当前目录下后缀名为.c的文件。如a.c、b.c。

A.rm .c
B.find . -name "
.c" -maxdepth 1 | xargs rm
C.find . -name “*.c” | xargs rm
D.以上都不正确

A rm .c 通配符,表示匹配任意字符任意次
B find . -name "
.c" -maxdepth 1 | xargs rm
find . -name "
.c" -maxdepth 1 找到当前目录下.结尾的文件,目录深度为1
xargs是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,用于很多不支持管道来传递参数的命令
C find . -name "
.c" | xargs rm 会将子目录下的文件也会删除
D 以上都不正确

3.vi编辑器中,删除一行的命令是?

B dd 删除光标所在行内容
C yy 复制光标所在行内容

4. Vi编辑器中,怎样将字符AAA全部替换成yyy?

B.s/AAA/yyy/g

4.序的完整编译过程分为是:预处理,编译,汇编等,如下关于编译阶段的编译优化的说法中不正确的是

A.死代码删除指的是编译过程直接抛弃掉被注释的代码
B.函数内联可以避免函数调用中压栈和退栈的开销
C.for循环的循环控制变量通常很适合调度到寄存器访问
D.强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令

死代码删除是编译最优化技术指的是移除对程序运行结果没有影响的代码

5. 下列关于makefile描述正确的有?

A.makefile文件保存了编译器和连接器的参数选项
B.主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释
C.默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件, 找到了解释这个文件
D.在Makefile不可以使用include关键字把别的Makefile包含进来

makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件.

Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。

3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。

5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。

默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用 “GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。

在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:

include ; filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)

6.在CPU和物理内存之间进行地址转换时,( )将地址从虚拟(逻辑)地址空间映射到物理地址空间

A.TCB
B.MMU
C.CACHE
D.DMA

A TCB 线程控制块
B 内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制
C CACHE 高速缓存
D DMA 直接内存存取

7.通过fork和exec系统调用可以产生新进程,下列有关fork和exec系统调用说法正确的是? [多选]

A.fork生成的进程是当前进程的一个相同副本
B.fork系统调用与clone系统调用的工作原理基本相同
C.exec生成的进程是当前进程的一个相同副本
D.exec系统调用与clone系统调用的工作原理基本相同

A fork调用通过复制父进程创建子进程,子进程与父进程运行的代码和数据完全一样
B fork创建子进程就是在内核中通过调用clone实现
C exec是程序替换函数,本身并不创建进程

7.进程、程序、作业

A 程序是静态的概念;进程是程序在处理机上一次执行的过程,是动态的概念,一个程序可以作为多个进程的运行程序

B 一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合,一个作业可由多个进程组成,且必须至少由一个进程组成

8. 关于 linux 的进程,下面说法不正确的是:

A.僵尸进程会被 init 进程接管,不会造成资源浪费;
B.孤儿进程的父进程在它之前退出,会被 init 进程接管,不会造成资源浪费;
C.进程是资源管理的最小单位,而线程是程序执行的最小单位。Linux 下的线程本质上用进程实现
D.子进程如果对资源只是进行读操作,那么完全和父进程共享物理地址空间。

解析:
A 僵尸进程指的是进程退出后不会完全释放资源,会造成系统资源泄漏;
B 孤儿进程在父进程退出后,父进程成为init进程,进程退出,孤儿进程的资源将被init进程释放
C 操作系统通过pcb实现对程序运行调度控制
D fork系统调用通过复制父进程创建一个子进程,父子进程数据独有,代码共享(在数据不发生改变的情况下父子进程资源指向同一块物理内存空间(调研写时拷贝技术))

9.以下描述正确的是 [多选]

A.程序中打开文件所返回的文件描述符, 本质上在PCB中是文件描述符表的下标
B.多个文件描述符可以通过dup2函数进行重定向后操作同一个文件
C.在进程中多次打开同一个文件返回的文件描述符是一致的
D.文件流指针就是struct _IO_FILE结构体, 该结构体当中的int _fileno 保存的文件描述符, 是一对一的关系

解析
文件描述符实际上是内核中文件描述信息表中数组下标,用户根据下标在进程pcb中的文件描述信息表中找到相应文件描述信息,实现对文件的操作;
不同下标的节点可以存放相同的文件描述信息结构指针
C 最小未使用分配规则
D 一个文件流指针一定对应一个文件描述符, 但是一个文件描述符可以为多个文件流指针保存。前者是1对1的关系, 后者是1对多的关系

10.Linux下两个进程可以同时打开同一个文件错误的是

A.两个进程中分别产生生成两个独立的fd
B.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
C.进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
D.任何一个进程删除该文件时,另外一个进程会立即出现读写失败
E.两个进程可以分别读取文件的不同部分而不会相互影响
F.一个进程对文件长度和内容的修改另外一个进程可以立即感知

解析
D 若进程已经打开文件,文件被删除时,并不会影响进程的操作,因为进程已经具备文件的描述信息

11.bash中,需要将脚本demo.sh的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 [多选]

A.bash demo.sh &>demo.log
B.bash demo.sh >&demo.log
C.bash demo.sh >demo.log 2>&1
D.bash demo.sh 2>demo.log 1>demo.log
解析
A command &> file 表示将标准输出stdout和标准错误输出stderr重定向至指定的文件file中。
B 与A选项功能雷同
C 将标准输出和标准错误都重定向到文件,

  1. 可以先将1-标准输出指向文件 >demo.log 前边的1可以忽略
  2. 再将2-标准错误指向1(因为1这时候已经指向了文件,因此2也指向文件) 2>&1

12.动态库的特点

动态库被加载在内存中,可以供多个使用库的程序共享映射到自己的虚拟地址空间使用,因此可以减少页面交换以及降低内存中代码冗余,并且因为与源程序模块分离,因此开发模式比较好

13.关于静态库与动态库的区别,以下说法错误的是()

A.加载动态库的程序运行速度相对较快
B.静态库会被添加为程序的一部分进行使用
C.动态库可用节省内存和磁盘空间
D.静态库重新编译,需要将应用程序重新编译

A 加载动态库的程序运行速度相对较慢,因为动态库运行时加载,映射到虚拟地址空间后需要重新根据映射起始地址计算函数/变量地址

13.以下关于管道的描述中,正确的是 [多选]

A.匿名管道可以用于任意进程间通信
B.匿名管道只能用于具有亲缘关系的进程间通信
C.在创建子进程之后可以通过创建匿名管道实现父子进程间通信
D.在创建子进程之前可以通过创建匿名管道实现父子进程间通信

解析:
第一:匿名管道只能实现本地进程之间的通信,不能实现跨网络之间的进程间的通信。
第二:匿名管道只能实现父进程和子进程之间的通信,而不能实现任意两个本地进程之间的通信。

14. 下列关于管道(Pipe)通信的叙述中,正确的是()

A.一个管道可以实现双向数据传输
B.管道的容量仅受磁盘容量大小限制
C.进程对管道进行读操作和写操作都可能被阻塞
D.一个管道只能有一个读进程或一个写进程对其操作

解析: A 管道是半双工通信
B 管道的本质是内核中的缓冲区
C 管道自带同步(没有数据读阻塞,缓冲区写满写阻塞)与互斥
D 多个进程只要能够访问同一管道就可以实现通信,不限于读写个数
若写端关闭,读端只能返回0。如读端关闭,写端返回错误值-1

15.ipcs/ipcrm

ipcs 查看进程间通信资源/ipcrm 删除进程间通信资源

-m 针对共享内存的操作

-q 针对消息队列的操作

-s 针对消息队列的操作

-a 针对所有资源的操作

不算 main 这个进程自身,到底创建了多少个进程啊?

int main(int argc, char* argv[])

   fork();
   fork() && fork() || fork();
   fork();

fork()创建子进程成功,父进程返回子进程的pid是大于0的 为真

子进程返回的是0 为假;

根据if语句的与和或逻辑进行判断即可

例如:

将fork进行编号 2号fork创建子进程后父进程为真,则父进程的3号fork会被执行,

然而其子进程返回0为假,则子进程的3号fork不会被执行。。。

主进程和1号子进程都会创建2号子进程和3号子进程,但是不会创建4号子进程,然后创建5号

主进程每次返回真,创建2号子进程,3号子进程,5号子进程

1号每次返回真,创建2号子进程,3号子进程,5号子进程

2号自己为假,会创建4号子进程和5号子进程

3号自己为假,会创建4号子进程和5号子进程

4号自己为假,只会创建5号

主-1 主进程创建1号后与1号雷同 因此进程数 10 * 2 = 20 减去主进程自身:19

 |-2

   |-4 2号自己为假,会创建4号子进程

    |-5 4号自己为假,只会创建5号

   |-5 2号自己为假,会创建5号子进程

  |-3 主/1号进程,创建2号返回真后创建3号进程

   |-4 3号自己为假,会创建4号子进程

    |-5 4号自己为假,只会创建5号

   |-5 3号自己为假,会创建5号子进程

  |-5

以上是关于linuxbingc(练习题)的主要内容,如果未能解决你的问题,请参考以下文章

linuxbingc(进程信号)

linuxbingc(进程信号)

linuxbingc(多线程)

linuxbingc(多线程)

linuxbingc(多线程)

一些汇编练习