骑驴找马, Linux 面试凉经分享 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gullitintanni
V2EX    职场话题

骑驴找马, Linux 面试凉经分享

  •  
  •   gullitintanni 74 天前 3269 次点击
    这是一个创建于 74 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要:/t/1139545

    虽然最后我勉强找了份工作,但情况并不是很妙:我接手的那套系统所支撑的业务线被大厂收购了(我入职后才知道这件事),他们有成熟的技术方案,用不到我们这套系统。所以等数据迁移完成后,这套系统将会停用。(谁说的做 infra 比做业务更稳定的啊喂,人家做业务的跑去跟大厂签合同了,我做底层的直接原地失业)

    其实也不完全算是失业,领导说到时候会安排我转岗,去做其他产品线的技术支持,薪资不变。这刚一毕业就去做技术支持,以后的职业生涯怕是离开发越来越远了。我还是有点追求的,所以这些天骑驴找马,继续准备面试。

    我们小县城也没什么开发岗位,我打算往二线及以上城市发展,找 Linux 开发相关的岗位,预期薪资 15k+(综合行情和自身能力,我觉得这个价位是比较合理的)。

    当然众所周知现在求职不容易,投了十几份简历,目前只接到了两个面试,全都一面挂。那就分享一下吧。


    首先是一家中小厂,面的游戏服务端岗位。

    微信电话面试,先是简单的自我介绍,然后问项目,问我最近解决的技术挑战。本来打算讲讲我梳理屎山代码的经历的,可是这玩意不结合具体代码不好讲。于是就讲了讲最近做的一个性能优化:

    我们系统里的进程间通信依赖一个消息中间件。其中对于那些需要原样发送的 raw 数据,本来是使用 splice 进行传递。虽然 splice 是 zero-copy 的,但仍然有系统调用开销,尤其是对于那些大量发送小数据包的场景,会影响性能。于是我做了基于 SCM_RIGHTS 的改造,将 fd “发送”给目标进程,从而进程间可以直接收发 raw 数据,无需 broker 对其转发。实测对于大量小数据包的场景,有 5-10% 的延迟和吞吐量改善。

    面试官对其中的一些细节进行了提问,但感觉他似乎并不了解什么是 SCM_RIGHTS 。

    然后就是技术问题环节,以 Linux 八股为主。随便举几个印象比较深的:

    • Linux 上 Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的?如何修改快捷键? 如果让你写个程序从而 ./changetty 3 切换到 tty3 你如何实现?
    • 如果让你调试一个 core dump ,但是没有 debug symbol 也没有源码,你的思路是什么?
    • 如何在 Linux 中实现在执行程序时校验签名的机制?你这样实现,用户有办法绕过么? 有没有一种实现方法,即使用户有 root 权限也无法绕过?
    • 你了解过 futexfd 么?为什么它从 Linux 内核中被移除了? 它的使用场景是什么?如果你有这样的使用场景,你如何用 Linux 现有的功能实现?

    其中大部分我只能说个模棱两可,毕竟没实际做过相关内容或深入学习过,只能根据已有知识推测。

    也问了一些网络和算法的八股,但这些是我的弱项,连续几个没答上来,就不再问了。一共持续了大概一个小时吧,最后面试官说,如果有后续,本周之内会再联系。今天已经周日了,应该是挂了。


    然后是武汉的一家小厂。虽然是小厂,但是小有名气,家人用过他们的产品也觉得不错。

    先是让我登进他们内网的一个平台(应该是搭的开源 OJ 平台)做题。四道编程题,语言 C/C++/Go/Rust 自选,时间 60 分钟,允许在本地编写然后复制到页面中提交。

    前三道不算太难,思路明确,分别是回溯、贪心、动归。如果对标 leetcode 应该稍低于 medium 的平均难度。还算顺利地做出来了(但不能确定是否处理好了所有的边界条件,因为提交后没有提示通过了多少测试用例),第四道没有思路,时间也不够了(后来查了下也可以贪心)。

    本来以为挂了,但是转天突然收到了面试邀约。

    先是问项目。比起工作中的内容,面试官对我的开源项目更感兴趣(虽然最多的也只有十几个 star ),而且比起实现细节,更关心技术选型的过程和最终敲定方案的理由。

    然后是一道场景题:实现一个简易的 terminal pager 。要求是既能支持常规文件,也能支持管道这种 non-seekable stream 。而且要控制好缓存逻辑,不能因为数据量太大而爆内存。支持的命令不需要太多,能翻页和跳转到首尾行即可(也就是 less 的 j/k/g/G )。

    还是 60 分钟,语言从 C/C++/Go/Rust 中自选,编辑器和工具链用我自己电脑上的,允许查资料(问 AI 也行),但是要全程屏幕共享,做题的过程也会被打分。

    本来我以为这个挺简单,甚至还玩起了花活,支持了一下 alternate screen 。然后很快发现时间不够用了。要想正确实现 pager ,还是挺考验编程能力的。

    于是我果断放弃了支持 soft wrap ,先把最基本的显示错乱的 bug 解决了。在时间结束的前一分钟,本来以为大功告成,突然 segfault 了,十分尴尬(后来看了下,是没处理好边界条件的原因)。但我自认为表现得还不错,完成度挺高的了,应该能过。

    然而今天刚刚收到邮件通知,面试没过。面评里写到:有一定的计算机基础和编程能力,但对于代码细节的掌控还有所欠缺,恐难以胜任。

    emm ,好吧,这确实是我的不足,需要在工程实践中逐步提高。


    接下来我会继续充电,不断提高自己,寻找合适的工作机会。大家如果有什么建议,或者想吐槽自己的面试经历,也欢迎留言讨论。

    23 条回复    2025-09-26 13:28:19 +08:00
    processzzp
        1
    processzzp  
       74 天前 via iPhone   3
    武汉那家应该是锂钠氪锶吧?如果你的目标是 15k 的话,更建议你去北上深杭一线城市找工作,一线城市开 15k 才是真的初级工作,二线城市的 15k 工资约等于一线城市 30k 工资的要求。二线城市只适合当地土著+初级工作躺平,但凡有一个条件不满足都建议去一线城市找工作
    prosgtsr
        2
    prosgtsr  
       74 天前 via iPhone
    虽然方向不同,但是看完我更加能理解为什么我找不到工作了,我就是个废物
    swananan
        3
    swananan  
       74 天前
    看 op 之前帖子,应该是刚毕业没多久。
    我感觉能通过做 fd 转发,提升 IPC 性能,最后能落地,已经挺不错的了。
    再把故事打磨一下呢,怎么发现这样的问题,如何确定方案(有什么其他的优化方案),怎么上线,最后怎么拿到性能提升的结果,如何体现对业务贡献度。看看这样拉扯,面试能不能顺利点
    感觉只是运气差了点,虽然是校招,15k 着实有点低了,找个厂子干几年再跳槽,应该会猛涨不少
    fcyxp
        4
    fcyxp  
       73 天前
    这些问题让我一个上班七八年的人 也不一定都回答得上来
    fcyxp
        5
    fcyxp  
       73 天前
    至于算法我更是一个也不会
    Yc1992
        6
    Yc1992  
       73 天前
    面试运气因素占比一半以上,感觉可以转服务端开发吧,Linux 桌面开发岗位很少
    j4fun
        7
    j4fun  
       73 天前
    哇可以用 ai 面试,这公司可以处~
    HermesLi
        8
    HermesLi  
       73 天前
    转行吧,骚年,别做计算机相关了,直接转行自媒体,都上 v 站了,翻新外网的热门剧本还是很吃香的,只要敢做,继续运维,目前并不占优势,且墙内供需关系已经变化了,本人 DevOps 在苏州一个小厂上班 20.5k ,算是团队核心成员,就我这个简历扔出去,就像石沉大海,后面我找了一下原因,以为我不行,诸不知直聘等很多公司发布的招聘是假的,如何解释?那就是保持招聘的状态,只聊天,实际上不招聘,每个岗位 500 元/月,这事儿我这两天才知道的。。。所以在找工作中难找不是没原因的,根本没机会好吧,不是你的问题,好多刁难,或者看起来很好的工作哪里轮得到新来的人,没内推吗?
    要么,找个内推的
    要么,web3 数字牛马
    要么,自媒体,当然你得花时间,既然都有自我提升的习惯了,换一个赛道不一定会很差,说不定打开新天地
    noogler67
        9
    noogler67  
       73 天前
    面的题我乍一看都不会。我是资深开发。
    gullitintanni
        10
    gullitintanni  
    OP
       73 天前
    @processzzp #1 这家公司我还是第一次听说,看名字还以为是做化工的。有机会去试试。

    其实一线的中小厂我也投了,目前还没收到过面试。去年秋招的时候倒是面过几家一线的大厂。
    GiveMeABigName
        11
    GiveMeABigName  
       73 天前 via Android
    @HermesLi 翻新外网的热门剧本是啥意思?
    wangyuescr
        12
    wangyuescr  
       71 天前
    @gullitintanni 这个公司是以前深度 deepin linux 技术人员王勇开的,王勇的云粉丝很多,和王垠有的一拼。
    以前 UOS 统信软件的企业微信 同事吧 还有人匿名发帖怀念王勇。
    wangyuescr
        13
    wangyuescr  
       71 天前
    @GiveMeABigName 就像金融投行中年老登面试官的场景剧,最开始是外网有的,然后国内也跟进整个汉化版。
    kiraskyler
        14
    kiraskyler  
       71 天前
    这两个问题我回答一下,v 站大佬多,有不对的多多指点:

    - 如果让你调试一个 core dump ,但是没有 debug symbol 也没有源码,你的思路是什么?

    gdb -c ,gdb 进入环境,敲 bt ,即使没有 debug symbol ,也可以看到每一层栈的地址,根据 info proc mappings 查看进程中已映射的动态库的地址位置,每一层栈都可以找到具体在哪个动态库,在动态库中的偏移,readelf -s -W 动态库可以找到符号在动态库中的位置。
    简而言之,这道题考察的是手动栈回溯。
    如果是 dwarf 的栈记录形式,一般面试不会问这个,dwarf 太复杂了,几十页标准,如果是不省略帧指针的站回溯,每一层栈都会先压栈 rbp 寄存器,甚至可以已知寄存器值就自己栈回溯。

    如何在 Linux 中实现在执行程序时校验签名的机制?你这样实现,用户有办法绕过么? 有没有一种实现方法,即使用户有 root 权限也无法绕过?

    - linux 内核里,execve 执行程序,每一种类型都有对应的内核模块,比如 elf 文件内核模块,"#!"开头的脚本也有内核模块跳转。可以通过在 elf 内核模块中添加校验。但是这种方式侵入性,写不好了可能内核会 dump ,也可以找到合适的位置,ebpf 方式 hock 内核,校验失败给进程发信号方式阻止运行,缺点是 ebpf 的 api 太少,不能自己读取内核文件,必须找到内核模块读取到校验信息的位置 hock 才可以。ebpf 方式也许用户态可以有办法停止,内核模块较难,卸载 elf 模块所有程序都不能运行了。
    kiraskyler
        15
    kiraskyler  
       71 天前
    @kiraskyler elf 签名机制还有纯用户态的方案,比如大多数 elf 都会使用动态库,一般也都使用 ld 作为链接器,这类 elf 启动时的入口是 ld ,可以在 ld 的源码里加校验。也可以使用 LD_PRELOAD 形式附加一个我们自己写的程序,并使用__attribute__((constructor))形式让一个函数提前于 main 函数执行,也可以做到校验功能,但这两种方法都对完全不使用 ld 链接器的程序无效,纯静态编译或指定链接器可以跳过此方法,这类程序的 elf 入口点直接指向本程序。但只让是使用 ld 的 elf ,用户态方案也都没问题,且用户态即使 root 执行也没办法(除非替换 ld/修改环境变量等)
    kiraskyler
        16
    kiraskyler  
       71 天前
    Linux 上 Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的?如何修改快捷键? 如果让你写个程序从而 ./changetty 3 切换到 tty3 你如何实现?


    ctrl+alt+fx 这一块内核代码没看过

    切换 tty
    可以直接 open("/dev/tty/3")得到文件描述符,dup 将现在的标准输入输出转发到 tty3 即可。但是否影响其他 tty3 用户未知。可以先遍历/proc/<pid>/fd 看看有没有进程使用 tty3 ,没有了再切换
    Clannad0708
        17
    Clannad0708  
       71 天前
    不是我现在工资比你高我看你的发的我都看不懂,上班 1 年了
    zjcpyc
        18
    zjcpyc  
       71 天前
    辞职躺了三个月准备去找工作,看到你的问题我都不想去了,继续躺吧,都不会
    gullitintanni
        19
    gullitintanni  
    OP
       71 天前
    @kiraskyler #16

    其实面试官说的切换 tty 想问的是 chvt(1) 的实现,当时我只记得是在 /dev/tty 上面调用某个 ioctl 实现的(具体答案是 VT_ACTIVATE )。

    所以我觉得这种八股挺无聊的,记得这些细枝末节又能怎样呢?想知道直接搜一下不就好了。
    kiraskyler
        20
    kiraskyler  
       70 天前
    @gullitintanni 学到了,确实是这样,这道题确实没有意思,考察不出来什么
    kiraskyler
        21
    kiraskyler  
       70 天前
    @gullitintanni 我又分析了第一题:linux 面试题:Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的? https://blog.csdn.net/weixin_42544902/article/details/149806468
    titanlpy
        22
    titanlpy  
       70 天前
    @HermesLi 每个岗位 500 元/月怎么理解?
    kiraskyler
        23
    kiraskyler  
       13 天前
    我又研究了第四题,[glibc pthread_mutex_lock/unlock futex 互斥锁的实现]
    https://blog.csdn.net/weixin_42544902/article/details/152123234
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1074 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 23:13 PVG 07:13 LAX 16:13 JFK 19:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86