Linux 经典面试题

2023-11-18

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文件。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 经典面试题 的相关文章

  • 使用inotify监控文件

    我正在使用 inotify 来监视本地文件 例如使用 root temp inotify add watch fd root temp mask 删除该文件后 程序将被阻止read fd buf bufSize 功能 即使我创建一个新的 r
  • 如何像C99一样使用make和编译?

    我正在尝试使用 Makefile 编译 Linux 内核模块 obj m main o all make C lib modules shell uname r build M PWD modules clean make C lib mo
  • 如何每周日运行 crontab 作业

    我想弄清楚如何每周周日运行 crontab 作业 我认为以下应该可行 但我不确定我是否理解正确 下面的说法正确吗 5 8 6 这是 crontab 格式的解释 1 Entry Minute when the process will be
  • 仅为我自己禁用和重新启用地址空间布局随机化

    我想在我的系统 Ubuntu Gnu Linux 2 6 32 41 server 上禁用地址空间布局随机化 ASLR 但是 如果我使用 sysctl w kernel randomize va space 0 我认为这一更改将影响系统上的
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • 在linux中将包含word的行从一个文件复制到另一个文件

    我想复制包含某些单词的行file1 to file2 Suppose file1 ram 100 ct 50 gopal 200 bc 40 ravi 50 ct 40 krishna 200 ct 100 file2应该只有包含 ct 的
  • 如何从内部找到C++ Linux程序的完整路径?

    我有这个要求 我需要从内部找到 C 程序的完整路径 对于Windows 我有以下解决方案 argv 0 可能包含也可能不包含完整路径 但我需要确定 TCHAR drive MAX DRIVE dir MAX DIR base MAX FNA
  • 设置 nginx 具有多个 IP

    我的 nginx 配置文件位于 etc nginx sites available 下 有两个上游说 upstream test1 server 1 1 1 1 50 server 1 1 1 2 50 upstream test2 ser
  • 使用 awk 处理多个文件

    我必须使用 awk 处理大量 txt 文件 每个文件 1600 万行 我必须阅读例如十个文件 File 1 en sample 1 200 en n sample 2 10 en sample 3 10 File 2 en sample 1
  • Laravel:调用未定义的函数 Symfony\Component\Console\mb_convert_variables()?

    我正在运行普通 Amazon EC2 服务器 我自己安装了 PHP 5 5 21 我的 Web 应用程序是基于 Laravel 构建的 几个星期以来 一切都进展顺利 然而 现在 当运行 Laravel 命令来更新数据库架构时 php 工匠迁
  • 为 Python 终端提供持久的历史记录

    有没有办法告诉交互式 Python shell 保留会话之间执行命令的历史记录 当会话运行时 在执行命令后 我可以向上箭头并访问所述命令 我只是想知道是否有某种方法可以保存一定数量的这些命令 直到下次使用 Python shell 时 这将
  • Linux CFS 调度程序代码在哪里?

    我有3 13版本的完整linux源代码 我试图找到 CFS 调度程序的源代码 根据流行书籍 它应该驻留在 kernel sched c 中作为基本调度程序代码 而 kernel sched fair c 专门针对 CFS 代码 我刚刚在 3
  • Linux中根据USB VID:PID获取设备路径

    如果我插入一个设备 比如说 dev ttyUSB0我想知道号码0基于其 VID PID 通过lsusb 我怎样才能在 C Linux 中做到这一点 我有这个代码来查找一台打印机设备 如果有帮助的话 int printer open void
  • 从多个进程附加到单个文件的“线程安全”?

    假设我有 X 个进程打开文件 Y 进行追加 每个进程一次只写入一行 带有 n 真正的日志条目 文件 Y 中的每一行是否保证不会错误地交错 更新 本地附加文件系统 问题取决于正在进行什么类型的写入 如果您使用带缓冲的标准 I O 这通常是大多
  • 在 Linux 内核中使用断言

    我有一个问题assert 在Linux中 我可以在内核中使用它吗 如果不是 例如 如果我不想输入 NULL 指针 您通常会使用什么技术 对应的内核宏是BUG ON and WARN ON 前者适用于当您想让内核恐慌并使系统崩溃 即不可恢复的
  • rusage 进程/线程的 Cpu 时间不可能

    我正在计算进程 线程正在使用的 cpu 时间之间的增量 以及某个函数的调用之间的增量 我得到了进程 cpu 时间不可能的值 有时下一次调用会返回较小的 cpu 时间 这是不可能的 这是我用来计算CPU时间的代码 u64 CpuTime ca
  • 无法通过 SSH 连接到 Google 计算引擎

    我在一个新项目中设置了一个新的 Google Compute Engine 实例 我启动实例并使用命令gcloud init连接到我的项目 然后我使用命令sudo gcloud compute ssh instance 1 它引导我完成 S
  • 安装 python-dev 和链接库后,Cython 中的 Hello World 程序因 gcc 失败

    我创建了一个简单的 hello world 程序 并尝试使用 gcc 执行生成的 C 程序 但无论我做什么 我都会得到大量未定义的引用 SO 有很多类似的问题 但他们都说安装 python dev 或其某些变体 或添加用于链接和加载库的标志
  • 如何在bash中使用kill SIGUSR2?

    我在linux中使用iptraf来监控网络流量 shell命令是 让iptraf在后台运行 iptraf s eth0 f B L traffic dat 如果我想得到结果 我必须先停止 iptraf 所以我使用 shell 命令 kill

随机推荐

  • 【深度学习】从LeNet-5识别手写数字入门深度学习

    活动地址 CSDN21天学习挑战赛 目录 LeNet模型 搭建环境 安装需要的包 创建工程 数据集 相关代码 可以设置GPU训练 默认CPU 通过TensorFlow下载数据集 对数据进行归一化处理 最值归一化 normalization
  • kvm创建快照与还原

    对k8s m1虚拟机创建快照 virsh snapshot create as k8s m1 20190317 查看虚拟机镜像快照的版本 virsh snapshot list k8s m1 或者 qemu img info opt kvm
  • Qt信号与槽

    信号与槽是Qt编程的基础 信号与槽在Qt中处理界面各个组件的交互操作时变得更加的直观和简单 信号 信号 Signal 就是在特定情况下被发射的事件 GUI程序设计的主要内容就是对界面上各个组件的信号进行响应 只需要知道什么情况下发射哪些信号
  • Vim配置#Vim插件安装#NERDTree配置

    一 centos系统的Vim安装 普通用户下输入命令 yum y install vim 之后输入y 即可等待安装完成 二 Vim的配置 如果你需要配置vim 只需在Home目录创建一个 vimrc文件即可以配置vim了 如需安装插件 在
  • mybatis ----数据级联查询(多对一)

    工程的目录结构 有两个表 一个文章表article 一个用户表user create table article id int 11 not null auto increment userid int 11 not null title
  • vscode连接github

    此次采用ssh方式 分为以下几步 目录 1 生成公钥 配置到github 2 在本地建立仓库 推送到本地的master分支 3 在github建立仓库 复制ssh 进行推送 一 生成公钥 本地生成公钥和私钥 将公钥配置到github中 通过
  • spark内存模型

    Spark 1 6 开始使用了统一内存管理模块 UnifiedMemoryManager 并引入了堆外内存 Off heap memory 1 6之前的内存管理就不进行介绍了 spark堆内和堆外内存模型的示意图 注意 堆外内存是依赖于wo
  • 258. Add Digits

    class Solution public int addDigits int num int nRet 0 if num lt 10 return num int nTemp 0 while num 0 nTemp nTemp num 1
  • Python Cheat Sheet -- 速查表

    这是基于Python Crash Course Second Edition的知识速查表 很全面的知识梳理脑图 后面附有下载链接 供大家学习 参考资料 https github com ehmatthes pcc 2e https ehma
  • Java基础知识超详细总结

    1 Java文件格式 Java源文件 java 保存Java源代码 Java字节码文件 class 保存对Java源代码编译之后的内容 2 Java文件运行方式 1 将源代码保存在扩展名为 java的文件中 如果源程序中定义了public类
  • 黑苹果不能使用无线网解决办法

    网上找了很多方法 都不能让我的黑苹果上网 果然还是得靠自己 抱着碰碰运气的态度 通过四叶草 安装驱动 在下图所示的已经安装的驱动中 我可以明确的告诉大家 其中一个是usb上网的驱动 也就是说 可以通过手机usb共享网络 而在这之前 我只能通
  • 从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能

    1 从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 2 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 3 从0开始写Vue项目 Vue页面主体布局和登录 注册
  • Element UI 之坑

    el procomfirm 事件 confirm 低版本的需要改 onConfirm
  • 【华为OD机试 2023 B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 游戏外包开发技术难点分析

    游戏开发涉及多个领域的技术 因此在开发过程中可能会遇到很多技术难点 今天和大家分享一些常见的游戏开发技术难点 希望对大家开发游戏有一定帮助 北京木奇移动技术有限公司 专业的软件外包开发公司 欢迎交流合作 1 图形渲染 游戏开发中的图形渲染技
  • vue从入门到入土--------综合案例

    目录 vue cli 组件库 axios 拦截器 proxy 跨域代理 用户列表案例 总结 vue cli 1 什么是 vue cli vue cli 俗称 vue 脚手架 是 vue 官方提供的 快速生成 vue 工程化项目的工具 vue
  • python基础六:列表

    1 序列 1 1基本概念 序列就是python中最基本的一种数据结构 用于保存一组有序的数据 所有的数据在序列当中都会有唯一的一个位置 索引 与之对应 并且序列会按照数据添加的顺序来分配索引 1 2序列的分类 可变序列 序列中的元素可以改变
  • Pycharm里如何调整代码字体大小?

    步骤一 我们在桌面上找到Pycharm 并将其打开 步骤二 打开pycharm之后 我们点击左上角的file选项 也就是文件的选项 步骤三 在文件的选项下 我们选择settings的选项 然后打开settings的窗口页面 步骤四 进入到s
  • ssh怎么访问服务器文件,ssh本地访问远程服务器文件

    ssh本地访问远程服务器文件 内容精选 换一换 Cloud Init工具安装完成后 请参考本节操作配置Cloud Init工具 已安装Cloud Init工具 已为云服务器绑定弹性公网IP 已登录云服务器 云服务器的网卡属性为DHCP方式
  • Linux 经典面试题

    1 下面关于pthread线程相关的 说法正确的是 a 线程是可以通过pthread create来创建 b 在线程中使用usleep 50 1000 一定是精确无误地休眠50毫秒 c 如果有个全局变量在没有加锁保护的情况下被两个线程同时访