前天晚上考的Linux阶段性复习题,考的有些个烂,被老师提出去训了一顿,确实还是基础不行啊,今天把这个题拿出来与大家分享一下,希望对大家有帮助,都会附有答案和讲解,也说明了Linux中,基础很重要,我比较注重实操代码,后面的代码题,都还是没问题的,就是前面的理论有些个烂,加油,兄弟们!
第一阶段复习考试题(问答题)每题3分
1、简述如下目录的功能(这些是重要的,必须掌握的,其他的目录作为了解就好)
/boot 开机引导目录
/etc 配置文件目录
/lib 存放库文件
/bin 普通用户可执行的指令
/home 普通用户的家目录
/root 管理员的家目录
2 写出15个熟悉的linux 命令,并说明其功能
答: 文件:cp rm mv cat less more tail head vi/vim find grep touch mkdir
进程**:ps kill top jobs**
打包:tar gzip
3 linux 系统都有哪些类型的文件?每种类型用什么符号标识?
答:标识符号怎么查看呢 在Linux终端输入ls -l
在权限rwx这些前面的那个就是标识
普通文件 -(-是普通文件的标识)
目录文件 d
管道文件 p
链接文件 l
设备文件 c,b
套接字 s
4 文件有哪些基本权限,分别对用的数值是多少?
答:`
**r权限对应的数值为4
w权限对应的数值为2
x权限对应的数值为1
-(减号是无权限)对应的数值为0**
5 将一个名为file 的文件权限改成属主具有读写执行,同组人具有读写权限,其他人没有任何权限,写出命令:
答:chomd 760 file
该命令就是将属主权限改为读写执行
同组人改为读写
其他人无权限
当然也可以换种方式写 就是比较麻烦:
chomd u = r+w+x file
chomd g = r+w file
6 将main.c 生成对应的可执行程序main, 中间一共经过几个步骤,分别是什么?并给出对应的gcc 编译命令。
答:四个步骤 预编译 编译 汇编 链接
gcc -E main.c -o main.i;
gcc -S main.i -o main.s;
gcc -c main.s -o main.o
gcc -o main main.o
与上面的四个步骤分别对应起来就行
7 有三个文件 main.c ,add.c max.c 部分内容如下,请给出编译命令:
main.c如下
#include <stdio.h>
int add( int x, int y);
int max( int x, int y);
int main()
{
int a = 2;
int b = 3;
printf("a+b=%d\n",add(a+b));
printf("max=%d\n",max(a,b));
}
add.c 如下:
int add(int x, int y)
{
return x + y;
}
max.c 如下:
int max( int x, int y)
{
return x > y? x : y;
}
答:一步完成编译的命令为:
gcc -o main main.c add.c max.c
8 请写出makefile完成对第7题的自动编译。
答:这块就是写出mkfile的方法
all:main
main:main.o add.o max.o
gcc -o main main.o add.o max.o
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
max.o:max.c
gcc -c max.c
clean:
rm -rf*.o main //销毁.o文件的的
9 调试使用什么工具?常用的调试命令有哪些?
答:gdb命令调试命令
显示代码l
单步执行n
设置断点b
程序执行r
进入函数s
开始调试的命令:
gcc -o main main.c add.c max.c -g
gdb main
10 什么是库?请简述共享库和静态库的区别.
答:库是预先编译好的函数(方法)的集合;
静态库:在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。
动态库:在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在
11 如第7题代码,请将add.c 和max.c 中的方法生成到静态库libfoo.a中,写出生成库的命令:
答: 这个将add.c和max.c的方法生成到静态库中,首先得将add.c和max.c汇编成add.o和max.o
gcc -c add.c
gcc -c max.c
//然后对这两.o文件整合到静态库中
ar crv libfoo.a add.o max.o //这行命令就是整合add.o和max.o的
12 如第7题代码,请将add.c 和max.c 中的方法生成到共享库libfoo.so中,写出生成库的命令
答:同样的,先将add.c和max.o汇编为.o文件 然后进行整合
gcc -c add.c
gcc -c max.c
//然后对这两.o文件整合到共享库中
gcc -shared fPIC -o libfoo.so add.o max.o //共享库生成命令
13 查看可执行程序用到哪些共享库使用那个命令?
答:ldd main //这块就是ldd加可执行程序进行查看使用了共享库的命令
14 什么是进程?进程有那些基本状态?
答:程序执行起来叫进程
基本状态:就绪 执行 阻塞
15 程序与进程有什么区别?
答:程序执行起来叫进程 进程是程序执行的过程
16 linux系统中主函数有哪些参数,,写出主函数的完整形式,并说明各个形参的意义分别是什么?
答 :
int main(int argc,char* argv[],char* envp[]) //分别对应参数个数,参数内容,环境变量
17 库函数和系统调用有什么区别?
答:系统调用是直接调用内核效率高 库函数则是到指定或默认的目录下去找寻该函数的定义效率低于系统调用
18 ipc机制有哪些?
答:管道通信 共享内存 信号量 消息队列
19 有名管道和无名管道的区别?
答:有名管道就是任意两进程间都可以用来通信 无名管道只能在fork()之后的父子进程之间通信
20 什么是僵死进程?如何处理僵死进程
答:僵死进程就是子进程先于父进程结束了 但是父进程没有获取子进程的退出码(状态信息)
处理僵死过程的办法是使用wait
21 如下代码一共产生多少个进程?
int main()
{
fork()||fork();
}
答:3个进程 具体去看我的这篇博客:
fork()||fork()||fork()
里面详细解释了这个题 以及它的拓展题
22 如下程序分别输出多少个’a’?
int main()
{
for( int i = 0; i < 2; i++)
{
fork();
printf("a\n");
}
}
答:6
具体解释去看我的这篇博客:
fork后有无\n的打印
23 如下程序分别输出多少个’a’?
int main()
{
for( int i = 0; i < 2; i++)
{
fork();
printf("a");
}
}
答:8
具体解释去看我的这篇博客:
fork之后有无\n的打印
24 什么是临界资源,什么是临界区?
答**:临界资源就是只允许一个进程访问的资源 临界区就是访问临界资源的那段代码**
25 请说明信号量的pv操作分别代表什么意思?那个操作可能阻塞为什么?
答:pv操作就是对信号量的减一和加一的操作! 当信号值由p操作减一之后变为零,临界资源就不可访问 就阻塞住了!然后v操作就是将信号量加一,使得临界资源变得再次可访问!
第一阶段复习考试题(编程题)
26 写程序,父进程复制产生子进程,在父子进程中循环打印7次字符串“parent",
在子进程中循环打印3次字符串"child",补全代码:(8分)
答案:
int main()
{
char* s = NULL;
int n = 0;
pid_t pid = fork();
if(pid == 0)
{
for(int i = 0 ; i < 3 ; i++)
{
printf("child");
}
}
else
{
for(int i = 0 ; i < 7 ; i++)
{
printf("parent");
}
}
}
27 写程序使用open,read,write,close等系统调用,对文件a.txt进行复制生成b.txt (8分)
int main()
{
int fdr = open("a.txt",O_RDONLY);
int fdw = open("b.txt",O_WRONLY|O_CREAT,0600);
//这是两行提示代码 源码在我这篇博客中写的很明白 代码注释以及讲解都有
if(fdr == -1 || fdw == -1) //创建和打开失败 返回值为-1
{
exit(0);//直接终止掉程序
}
char buff[1024] = {0};
int num = 0;
while((num = read(fdr,buff,50)) > 0) //文件标识符往buff中去读取 每次50个字节
//ssize_t read(int fd, void *buf, size_t count);
//这块fdr是文件描述符
{
write(fdw,buff,num); //每次写入num个字节
}
close(fdr);
close(fdw);
}
源码(附有讲解及原理图)博客链接:
https://blog.csdn.net/qq_45829112/article/details/120921294
28 写程序改变SIGINT信号的响应方式,使得程序在第一次收到信号时,打印信号的代号值,第二次收到信号时按默认方式结束程序。修改补全代码:(9分)
代码已经补全 下方有原理图
void sig_fun(int sig)
{
printf("sig=%d\n",sig);
signal(sig,SIG_DFL);
}
int main()
{
signal(SIGINT,sig_fun); //SIGINT就是程序终止程序 也就是Ctrl+C
while(1)
{
printf("hello\n");
sleep(1);
}
return 0;
}
对于这道题 我们首先得知道这个原理图:
兄弟们 Linux的基础还是很重要的,不要过于注重什么高大上的代码知识,先给地基搭好,以后楼会盖的很高,未来的路也会更宽!