Linux 经典面试题

1)下面关于pthread线程相关的,说法正确的是:
a: 线程是可以通过pthread_create来创建
b: 在线程中使用usleep(50*1000)一定是精确无误地休眠50毫秒
c: 如果有个全局变量在没有加锁保护的情况下被两个线程同时访问,程序会编译不过
d: 线程之间可以使用自旋锁来保护公共变量。

答案:AD

分析:

b:对于Linux这样的分时系统来说,由于进程调度和系统时间中断精度的原因,一个usleep很可能在毫秒以上了。如果需要微秒级的定时精度,需要使用实时操作系统(比如 VxWorks)。
关于usleep是这么说的:
The usleep() function will cause the calling thread to be suspended from execution until either the number of real-time microseconds specified by the argument useconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system.
Implementations may place limitations on the granularity of timer values. For each interval timer, if the requested timer value requires a finer granularity than the implementation supports, the actual timer value will be rounded up to the next supported value. 

c:不加锁,会导致全局变量在不知道的情况下被另一个线程修改。但是不会导致程序编译不过。

d:自旋锁与互斥量功能一样,唯一一点不同的就是互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待,直到得到锁。自旋锁在用户态使用的比较少,在内核使用的比较多!自旋锁的使用场景:锁的持有时间比较短,或者说小于2次上下文切换的时间。面试官说用户态的线程只能用互斥锁和信号量,这点得不到查证

2)关于用户空间内存的相关的,说法正确的是:
a: 使用malloc大内存而还未对它操作(如memset)时,操作系统可用内存一定马上减少相应大小
b: 在一个函数还没有运行结束时,其局部变量如果被另一个线程的其它函数访问了,程序一定会死机
c: 一个函数被递归调用时,该函数的一个局部变量a所在的空间各不相同
d: 动态库.so被两个进程访问时,由动态库内函数malloc分配出来的内存在两个进程中是共享的

答案:C

分析:

a:第一点,物理内存肯定不会立马分配的,malloc 申请的是虚拟内存,申请的时候并没有进行映射。访问到的时候触发缺页异常,这个时候才会进行物理地址映射。第二点,操作系统可用内存意思就是虚拟内存,malloc是用户态申请内存的方式,一般来说,内核总是尽量推迟给用户态进程分配动态内存。如果是内核态申请内存,内核是绝对信任自己的,没有道理试图推迟这个请求。

b:多线程可以同时访问局部变量,如果局部变量加了自旋锁,那么该线程会等待,如果加了互斥锁,那么该线程会休眠。但绝不会死机。

c:每一层递归都会有自己的栈空间。

d:每个进程都会有一块自己内存空间,怎么可能会共享呢?除非使用了进程通信的共享内存方法。

3)关于内核分配内存的函数可以有哪些:
a: malloc
b: __get_free_pages
c: kmem_cache_alloc
d: ioremap

答案:BCD

分析:

kmalloc、vmalloc、kmem_cache_alloc、ioremap以及__get_free_pages()是分配的是内核的内存,malloc分配的是用户的内存。kmalloc、__get_free_pages()、kmem_cache_alloc、ioremap保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续。

4)关于makefile,以下说法是正确的是:
a: 编译c语言程序生成*.o时可以使用隐含规则,其中隐含规则默认会使用变量CFLAGS的值
b: makefile中可以使用//来注释
c: makefile中的include指令相当于跳转到include所指定的makefile去执行
d: export可以让一个变量在子makefile中被访问

答案:AD

分析:

a:“隐含规则”会使用一些我们系统变量,我们可以改变这些系统变量的值来定制隐含规则的运行时的参数。如系统变量“CFLAGS”可以控制编译时的编译器参数。

b:makefile的注释是使用‘#’。

c:makefile中include的文件一般都是file.dep文件,需要在makefile当中拓展开来。

d:export出来的变量将被子make进程继承。

5) 以下哪些是属于系统调用函数
a: free
b: open
c: fork
d: fwrite

答案:ABC

分析:free、open、fork都是系统调用函数,fread,fwrite属于C语言标准库,会对数据进行缓存。

6)以下哪些文件系统是可写的
a: yaffs
b: cramfs
c: nfs
d: ext3

答案:ACD

分析:YAFFS是第一个在GPL协议下发布的、基于日志的、专门为NAND Flash存储器设计的、适用于大容量的存储设备的嵌入式文件系统。CRAMFS文件系统是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩,文件系统类型可以是EXT2或EXT3。网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。EXT3是第三代扩展文件系统(英语:Third extended filesystem,缩写为ext3),是一个日志文件系统,常用于Linux操作系统

7)关于在linux PC上运行嵌入式交叉编译链比如arm-linux-gcc,以下说法是正确的是:
a: arm-linux-gcc程序本身的二进制属于ARM指令
b: arm-linux-gcc编译生成的程序的二进制属于ARM指令
c: 如果使用arm-linux-gcc编译的程序代码中包含#include <stdio.h>,那么该stdio.h文件所在的位置是linux PC gcc所在目录/usr/include下。
d: arm-linux-gcc编译多个*.c文件时,必须要手动调用arm-linux-ld去链接各个*.o

答案:B

分析:

a,b:arm-linux-gcc编译生成的文件就是给arm机器用的,其二进制当然属于ARM指令。

c:这里审题没审好,有个坑。一般gcc的stdio.h就在/include下,arm-linux-gcc的stdio.h就在/usr/include下,忽略了是gcc所在目录/usr/include下。正确应该是那么该stdio.h文件所在的位置是linux PC arm-linux-gcc所在目录xxx下,管它是什么。

d:gcc和arm-linux-gcc功能都是一样的,只是生成的可执行文件的架构不一样,gcc -c 的时候才不会链接。

8)gcc编译时如果提示can not found –lz,以下说法正确的是:
a: gcc的-L所指定的目录中可能并没有包含libz(指的是libz.a或libz.so)所在的路径
b: 即使gcc的-L所指定的目录中存在libz(指的是libz.a或libz.so)这样的一个文件,但是依然可能会提示找不到-lz
c: 如果没有gcc –L中显式指定libz(指的是libz.a或libz.so)所在位置,那一定会提示找不到-lz
d: 如果gcc CFLAGS有-static选项,gcc是不会寻找libz.so

答案:A

分析:

b:不是很确定,工作中好像有遇到过,但不记得了。什么时候想起再写出来。

c:还有一种情况,就是libz.a或者libz.so在系统的环境变量里面。

d:-static 对应的是静态库(xxx.a),-shared 对应的是动态库(xxx.so)

 

9)关于嵌入式arm-linux-gcc编译生成二进制执行程序的elf信息,以下说法正确的是
a: 可以通过arm-linux-ar命令去查看一个arm-linux-gcc编译生成的二进制文件的elf信息
b: 如果被编译的程序代码中包含char *str=“this is test code”;那么str属于elf格式中的代码段
c: arm-linux-strip的作用是去掉elf中的调试信息,对程序执行没有影响
d: linux内核装载驱动ko模块是依赖于elf格式中特殊的段来实现的

答案:CD

分析:在windows中可执行文件是pe文件格式,Linux中可执行文件是ELF文件。在Linux下的ELF文件除了可执行文件(Excutable File),可重定位目标文件(RellocatableObject File)、共享目标文件(SharedObjectFile)、核心转储文件(Core DumpFile)也都是ELF格式文件。

a:arm-linux-ar一般用于创建或者操作库文件,Linux下专用工具readelf来查看elf文件信息。

b:str指向一个常量区,但是如果str是局部变量,那么存储在栈上;如果str是全局变量,那么存储在数据段。

c:正确

d:正确,ko文件是elf格式的可重定位二进制文件,相当于给内核用的.o文件。

 

 

 

 

 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值