给大家分享一下我经历的Unix C面试题

跳过“请做下自我介绍”那句面试考官口头禅,咱们直接进入正题

1、内存对齐(也叫对界,指结构体或联合体,关键字#pragma pack),为什么要做这对齐

2、系统调用和库函数的区别

3、有三个数据包,每个一千字节,在用udp时接要接收几次,tcp时几次

4、select、poll和epoll的区别,效率呢

5、epoll的Edge Triggered和Level Triggered有什么区别,哪个效率高,为什么

6、套接字和文件描述符的区别

7、谈谈C++虚函数

8、对于36进制数减法要如何实现

9、分别存有一亿条QQ号和一千万条QQ号的两个文本,怎样从中取交集并集

10、什么是软中断(Linux内核的)

11、讲讲fork调用

12、系统调用open有哪些flag

13、谈谈进程中的堆和栈
14、进程和线程的区别
15、多线程编程中要注意什么问题
16、什么是HTTP DDoS攻击
17、TCP头部,TCP三次握手,一个TCP包最多能有多大
18、IPC之于文件系统
19、谈谈消息队列里的type(或者是共享内存,我忘了)
20、谈谈设计模式、什么是观测者模式
21、谈谈服务器模型
22、UML,什么是结构图,软件开发中的瀑布模型
23、了解CGI么
24、微博用户页面上列出他所关注用户动态,要如何做架构,考虑一个用户会有大量粉丝,或是关注大量的人
25、大端序和小端序,怎么转换

============================

http://blog.csdn.net/howeverpf/article/details/41412031

 需要提前说明的一点是,由于这系列文章都是记录我自身参加各大公司校招的经历,部分推断或评价(尤其是对面试官的评价)是带有很大主观色彩和一定偶然性的,不一定准确也不求客观,所以我的这些文章真的只能作为一个侧面的参考。管中窥豹,可见一斑,但切勿以偏概全哦~

 

一、网申

校招主页http://hr.xiaomi.com/campus/index

       小米的绝大部分研发类岗位工作地点都在北京,除此以外,仅“软件开发工程师”和“软件测试工程师”有少量工作地在上海;其网申系统只允许投递一个岗位志愿。

       小米校招网站上对研发类岗位还划分得蛮细的,对于安全方面,有专门的安全工程师这一独立的岗位,其要求如下:

图1 小米-安全工程师的岗位需求信息描述

 

二、笔试(运维类)

       仅就我们考场来看,小米研发类(貌似仅软件)的笔试分A、B两套试题,其中A卷供应聘非运维类岗位的童鞋使用,B卷供应聘运维类岗位【如图1,职位列表条目中用(运维部)标注】的童鞋使用,比如应聘安全工程师的我。A卷我大概瞟了一眼,貌似以程序设计的大题为主,而B卷则以问答题为主。

       B卷的范围主要涉及:Linux应用基础、计算机网络、网络安全(主要是Web渗透方面)、编程开发、数据库原理与应用。下面例举了一些我当时遇到的题目:

 

[plain] view plaincopyprint?派生到我的代码片

 

  1. 1.设计一个shell脚本xm.sh,在/tmp/test下创建50个目录,即user1至user50,并设置每个目录权限,其中其他用户权限为“读”,文件所有者权限为“读写执行”,文件所有者组的权限为“读执行”。  
  2.   
  3. 2.Linux系统中执行uptime后会有以下输出:  
  4. 10:54:44 up 158 days, 20:11, 3 users, load average:0.62, 0.41, 0.31  
  5. 其中load average的三个值分别代表什么含义?造成load值很高有哪些常见的原因?  
  6.   
  7. 3.线上运行的程序/usr/sbin/nginx,有可能因为某个特殊请求或BUG导致服务异常退出,但可以通过重新开启继续服务。设计一种方式,能够监管程序异常,并在异常退出时自动开启。  
  8.   
  9. 4.Linux系统掉电有可能造成数据损失,原因是什么?有哪些方面可以降低或避免这种问题?  
  10.   
  11. 5.有用户反馈无法访问http://www.xiaomi.com,请简述排查过程和可能的原因。  
  12.   
  13. 6.ARP协议的用途是什么?简述其工作过程  
  14.   
  15. 7.简述你所了解的网站负载均衡方式。  
  16.   
  17. 8.Linux下常用的文件系统格式有哪些?其特性是什么。  
  18.   
  19. 9.如在PHP源码中有如下语句,有什么安全风险?并写出其利用原理  
  20. <?$_POST['a']($_POST['b']);?>  
  21.   
  22. 10.你所了解或者使用过的渗透测试工具都有哪些?分别阐述其工作原理,以及对比各自的优缺点。  
  23.   
  24. 11.简述线程和进程的关系,对比http server的多线程实现和多进程实现的优缺点  
  25.   
  26. 12.请简述链表与数组的区别:编写一个程序,merge两个升序数组,用你熟悉的语言实现,如果是C语言的话,方法签名如下: int[] merge_array(int[] a, int[] b)  
  27.   
  28. 13.前端web开发  
  29. a)CSS:列出display的值,说明他们的作用?  
  30. b)JavaScript:请列出js中的基本数据类型。  
  31. c)JavaScript:通过js来隐藏一个DOM元素,比如ele为被操作的DOM元素。  
  32.   
  33. 14.数据库理论  
  34. a)说说你对索引的理解(包括索引的结构、对dml影响、对查询影响)。一个表的索引是否越多越好?  
  35. b)什么是事务?有什么特性?  
  36. c)什么是巴斯-科德范式(BCNF)?  
  37.   
  38. 15.SQL语法  
  39.     有如下三个表:  
  40. 学生(学号,姓名,性别,年龄,系号)  
  41. 课程(课号,课名,学时)  
  42. 选课(学号,课号,成绩)  
  43. a)查询有不及格科目的学生姓名(60分及格)  
  44. b)查询各科成绩的最高分,显示课号和最高分  
  45. c)查询选课人数不足30的课程名称  

 

三、面试

       小米的技术面试一般是三面吧,前两面是技术面,第三面是主管面。我倒在了第二面,所以第三面的情况母鸡啦~

3.1 一面(安全工程师)

       一面采用电话面试的形式,主要针对简历上的内容发问,耗时1h20min左右。(电话打过来的时候大概11点10分左右,我正准备去吃午饭。当时想着面试完再吃也是一样的,就开始面了。结果面到一半的时候,去哪儿的二面电话又到了,只好在小米的面试结束后继续去哪儿的二面,两场面试耗时2个小时左右,生生把我的饭点蹉跎了,真是好心酸~~~)根据问题推断,应该是要对我做一个比较全面地初步了解。下面是我还记得的几个面试问题:

 

[plain] view plaincopyprint?派生到我的代码片

 

  1. 1.做个自我介绍  
  2.   
  3. 2.当初为什么选择信息安全这个专业?你觉得研究生阶段收获了什么?你觉得读研是否有价值  
  4.   
  5. 3.说说BASE64编码的过程  
  6.   
  7. 4.熟不熟悉Linux系统,Linux命令用的多么?会不会使用awk,比如说我要读取一个文件的第二行信息,应该怎么做?  
  8.   
  9. 5.几个项目经历的一些说明  
  10. a)项目是做什么的?应用环境?  
  11. b)系统的处理能力以及性能瓶颈  
  12. c)自己解决的问题,改进的地方  

 

3.2 二面(安全工程师)

       二面也采用电话面试的形式,提问偏向于一些开发的细节,耗时45min左右。根据问题推断,其目的是想要准确了解我的开发能力。下面是我还记得的几个面试问题:

 

[plain] view plaincopyprint?派生到我的代码片

 

  1. 1.几个项目经历的一些细节  
  2. a)后台部分采用的什么语言?PHP还是JSP?  
  3. b)项目的后台与前台之间采用什么通信机制?请描述细节  
  4. c)项目里面数据库是如何设计的,请描述数据表结构  
  5.   
  6. 2.用C语言设计一个公用函数,它的输入是n个字符串,功能是找出这些字符串的最长公共前缀,并将此前缀作为函数输出。  
  7. 请告诉我函数原型怎么写,函数怎么实现,你的实现时间复杂度又是多少?  
  8.   
  9. 3.你期望的薪酬?  
  10.   
  11. 4.你有什么要问的?  

 

3.3 面试官的介绍

 

[plain] view plaincopyprint?派生到我的代码片

 

  1. 1.我若能有幸加入你们的团队,主要从事哪方面的工作,需要哪方面的能力?  
  2. 答:我们的团队不大,主要做两方面的工作,一是Web安全,二是系统入侵检测与流量监控。另外还有云计算安全、私有DNS服务等。流量监控的话,主要是从流量中检测是否存在SQL注入。流量比较大,1000~2000个G(不知道有没有听错),所以会需要数据包捕获技术的优化以及数据包重组效率的提升。我们希望你对Shell脚本比较熟悉。  
  3.   
  4. 2.如果我被录用的话,就要去北京工作,不知租房如何,方不方便?  
  5. 答:一般我们都租公司附近的小区,月租大概是1000~2000,2000已经可以住得很舒适。  

 

 

四、小结

       就网申来说,小米的校招主页挂靠在小米官网上,感觉做得还比较简陋,使用起来也不是很方便。

       就笔试来说,小米的运维类岗位笔试考得范围比较广泛,也比较注重细节,深度的话一般,还算好做。

       就面试来说,小米面试对安全技术问得不多,开发的东西反而问得多些(当然,这也可能只是针对我而言,因为我本身也是偏安全开发方向的)。

       从回答来看,小米的安全工程师岗位偏向于安全运维类型,安全团队感觉还比较新,进去应该还有比较大的成长空间。

       总的来说,小米是第一个完全靠我自己的努力,走“正规”途径,从笔试一路杀入二面,并且我真心想去的公司。(百度给了第一次二面机会,但其实有公司缺人而捡漏的因素在其中;锐捷给了我第一次三面的机会,但其实我不怎么想去;去哪儿的二面也在小米二面之前,但正如我在骆驼篇中所说,这个二面的获取是有点取巧的)小米的这一段应聘经历,在我整个的九月求职历程中有着非常重要的强心剂和催化剂作用!

 

写在最后

       本文旨在从一个求职者的角度,将小米今年校招的流程、岗位需求对大家做一个简单的介绍,希望能够让有意在今后加入小米的学弟学妹们有所收获,有的放矢。作者经历有限,部分内容(笔试题目、面试形式等)仅针对成都地区。

       虽然我在文中记录了笔试面试的一些真题,但是我并不希望我的读者只是冲着这些真题而来,我希望的是,你们通过我的经历,能够从侧面对小米以及它安全工程师的岗位有更多的了解。共勉!

======================================

 

  • 3.07 看到实习生招聘信息;
  • 3.09 涂涂改改,写了一天简历,投递;
  • 3.11 收到一面通知;
  • 3.12 电话一面;
  • 3.15 收到二面通知;
  • 3.16 电话二面;

 

一面经过(全程73min)

 

1.1 三分钟以内的自我介绍

       由于没有任何思想准备,一开始愣了十几秒,完全不知道说什么。只是一直想着,必须得说点简历上没有提到的东西。就随便扯了点本科的经历和兴趣爱好什么的。后来好算让我把话题转到了我写博客的爱好上面,勉强觉得凑够了时间;

 

1.2 一些基础问题

 

1.2.1 详细说下TCP三次握手的过程

       这应该是针对我简历上有一句“ 熟悉TCP/IP协议族”。

       这个问题很简单,手到擒来。

1.2.2 能否说下常见应用层协议所使用的端口号?

       这应该是针对我简历上有一句“特别是对HTTP、DNS、SMTP、POP3等应用层协议有深入的了解”。

       这个问题只是简单的验证,也很好回答。

1.2.3 是否了解动态路由协议和算法

       只记得RIP和OSPF这两个名词了,更熟悉链路层协议和应用层协议,网络层还真不熟~~~

1.2.4 简单描述一下快速排序

       其实我简历上故意没提数据结构和算法方面的东西,就是对这方面有自知之明。大二学的东西,当时没学明白,后面项目中基本也没用上,早忘干净了,回头赶紧补补。

1.2.5 是否了解socket的几种I/O模型?

       这应该是针对我简历上有一句“熟悉Linux平台上基于C/C++的网络编程技术”。

       我所说的网络编程很大程度上是指数据包嗅探、解封、解析、构造四个方面。socket的I/O模型有看过,但是印象不深,干脆回答不清楚。【可以参考:http://www.svnclub.com/?q=node/1815

1.2.6 给定一棵二叉树上的两个结点,我们应该如何找出它们的最近父结点?

       这个,请参看1.2.4,呵呵……

1.2.7 是否知道进程的内存空间中有栈区、堆区之分?请问栈区的生长方向如何?又该如何用程序来验证?

       这倒是也有看到过,栈区的生长方向是高地址长向低地址,堆区反之。要用程序的验证的话,也明白可以利用函数调用的时候参数入栈来验证,但当时比较紧张,一时想乱了,只有放弃。【可以参考:http://www.cnblogs.com/xkfz007/archive/2012/03/27/2420158.html

1.2.8 服务器上磁盘占用率高,主要由一个进程不停往日志文件写数据引起。现在删了这个日志文件,但是磁盘占用率依旧不停在涨,而排查后发现其他进程都没有写文件行为,请分析一下原因。

       这应该是针对我简历上有一句“熟练掌握Linux下的基本命令操作,可以进行简单的系统与网络维护”

       这个,我只能说估计是进程打开文件后,使用的是文件句柄来读写文件。我们虽然删除了文件,但进程内使用的文件句柄并未因此失效,因此进程依旧在不停写数据。不晓得对不对。

1.2.9 对于一个div标签,我们如何设定段落内文字的字体大小和颜色?如何用JavaScript自动生成div标签?

       这应该是针对我简历上有一句“了解html/JavaScript/xml,可以制作简单的网页”。

       对于html这东西,我只是大概能看懂,会修改,你让我完全自己写,基本也是不会的。所以我回答,印象中是在标签里面可以设定一些属性,其中大小和颜色的设定应该是一个m开头的单词,具体是什么不记得了,需要用的时候再查。后来翻了一下以前编辑的网页,发现基本全说错了。真是自作孽~~~

1.2.10 对于系统架构、前后台交互、动态网页了不了解? 

       只是了解JSP、PHP的一些基本概念,知道的不多。对于我们自己的系统,我们前后台之间基于mysql交互,即后台把运算结果写入数据库,从数据库读入配置策略等信息;前台负责把用户设置的策略信息写入数据库,并从数据库读取运算结果显示给用户。系统架构方面的知识需要补补。

1.2.11 最近有没有看什么书?

       自知数据结构学的差,正在看《大话数据结构》。

 

1.3 针对我的项目经历提出的问题

 

1.3.1 什么叫嗅探?

       这是一个很简单但是不好说清楚的问题,我从分析网卡正常通信和嗅探的不同来解释这个概念。

1.3.2 基于SSL协议,两台主机之间怎样建立信任关系?

       这应该是针对我简历上有一句“熟悉OpenSSL开发库和工具,熟练掌握证书制作、OpenSSL编程、SSL协议分析”。

       说到了SSL连接建立的过程,还谈到了数字签名、CA证书的信任传递,勉强算是说清楚了吧。

1.3.3 HTTP协议的报文结构是怎样的?

       这应该也是针对我简历上有一句“特别是对HTTP、DNS、SMTP、POP3等应用层协议有深入的了解”。

       这个问题稍微具体一点,但我刚好以前专门给师弟们讲解过,而且这3年中不停有接触、深化,所以回答起来轻车熟路。

1.3.4 项目相关技术中你提到了mysql,你对它了解多少呢?你说你用到了mysql的C API,能举几个例子吗?

       这应该是针对我简历上有一句“熟悉MySQL数据库的基本命令操作与C语言编程API,可进行简单地数据库开发”

       就会常见的登录、建表、插入、更新、查询操作吧,会用简单的SQL语句。C API的话,主要是mysql_real_connect(),mysql_query(),mysql_store_result()这些吧

1.3.5 项目相关技术中你提到了libxml2,这个库你们主要是因为什么而采用的?

       系统使用了xml格式的配置文件,使用libxml2来解析配置文件。

1.3.6 项目中一些具体的的技术细节

       因为确实参与了很多项目,写的时候还分别挑了花费精力最多和最近接触的两个项目,所以这部分算是回答得不错。不过涉及到很多的项目细节,不宜透露过多,就不多说了。

 

1.4 你有什么想问的么?

 

1.4.1 请两位前辈评价一下我的简历,是否存在什么非常需要改进的地方?

       “倒是没有什么特别需要改进的地方。我觉得简历最重要的,就是呈现你会的技术,不要往上写不会的东西。经过这次谈话,我们觉得,你的简历基本还是符合实情的。”

1.4.2 根据此次交谈,两位前辈认为我在哪些方面还无法符合贵公司的要求,我应该从哪些方面提升自己的能力?

       “我们觉得你的项目经验还是很丰富的,但Linux开发这个方面,可能还是偏弱一点吧。对于开发来说,数据结构和算法方面的基础肯定是都需要的。如果你想要补这方面的话,我推荐你看严蔚敏老师的《数据结构》,这本书比较基础。网上还有严老师的教学视频,你可以下下来看看。”

1.4.3 您觉得,以我现在的情况,是去贵公司实习更能提升自己;还是说不去实习,努力补补相关基础更好?

       “两样都可以吧。”

1.4.4 贵单位主要做什么工作?我如果被贵单位录取,主要从事什么工作?

       “我们这边是属于运维部门的,具体工作的话,主要分为两类:一类是做具体的运维工作的,需要熟悉Python、Shell脚本等等;另一类是开发运维工具的,就要求熟悉Linux开发技术、数据结构、算法这些。如果你过来的话,主要看你自己兴趣,当然,也要考虑我们这边具体的情况”

1.4.5 我要多久才能拿到本次面试的结果,以什么形式?如果通过本轮面试,后面还有几轮?

       “本周内,电话通知。还有两轮,也是电话面试的形式。”

 

 

二面(全程43min)

 

2.1 对我的提问

 

2.1.1 请描述一下TCP四次挥手的过程

       好吧,这个我还真记不清了,只能按照自己的理解来尝试还原这个过程,结果还推错了……

2.1.2 你提到XX项目是从师兄手中接手的,那么请说下这个项目中哪些是原先就已经做好的,哪些是你做的?在这个过程中,你遇到了,解决了什么问题?又有什么收获?

       最早接触时,是底盘不动,根据师兄提供的接口做上层扩展,这段时期主要是遇到一些编译问题,语法问题;

       中期是针对已有底盘在不同网络环境下,以及针对不同目标时可能出现的问题进行分析解决,遇到的多是协议分析问题;

       后期对底盘做功能性扩展,遇到的主要是一些系统开发问题,架构设计问题,线程通信问题。

2.1.3 项目中你用到了什么进程间通信机制?

       这是一场意外~~~其实我是先写的下半年要用的通用简历,再删了一部分信息作为实习生简历投递给B公司。进程间通信是一个当前正在做的项目打算用到的,计划采用消息队列。还没有实际使用过,但是删减的时候漏了。所以…………赶紧实话实说,求谅解~~~

2.1.4 假设你要删除某个指定日期以前的日志文件,应该用什么命令?

       我只会用rm简单地删文件啊!!!好吧,这我不会~~~ 

 

2.2 我的提问

 

2.2.1 后面的三面还是技术面试么?

       “不是。如果你通过本轮面试的话,三面将由我们经理给你打过来,基本不谈技术了。”

2.2.2 你能否给我一点改进的建议?

       “就我个人通过这次面试的感觉,我觉得你的程序开发基本功还有待加强。当然,一次简短的电话看得不一定准确,我只是从你的回答中(你说主要解决一些编译、语法问题)得到结论,你的编码能力还不够扎实,需要进一步加深。当然,你能在短短的时间内,做那么多项目,还能在已有系统的基础上做出那些扩展和改善,我觉得作为一个学生来讲,还是很不错了。(我说导师总是一个项目刚做完就马上布置下一个项目,没时间深化、加固)我以前也是那么过来的,知道很多导师确实有你说的那些问题,但不管怎么说,我们都需要一个积累的过程。不然,你就只是为了做项目而做项目,没有一个消化积累的过程,那么下次又是从头开始了。积累,是我们这行必须注意的。”

 

 

本次应聘的总结与收获

 

       一言概之:知不足,有方向;心有谱,不再慌。

       第一轮面试,两位面试官相对问得比较宽泛,涉及了较多的技术领域,主要目的应该是想对我整个人做个相对比较全面的了解,核对简历上的内容是否真实。

       第二轮面试,面试官一方面是从自己更关心的、与前两位面试官不同的方面对我发问,对我做更多了解;另一方面,部分问题和第一轮有重叠,这可能也是起到对第一轮面试结果核实的效果。

       总的来说,两轮面试主要还是根据我的简历来发问的,所以写简历的时候一定要谨慎,不熟悉的东西千万不能往上写,当然也不能过于谦虚,否则连面试的机会都得不到,也丝毫没有意义。

       有些问题是必问的,想逃也没用,必须用心准备。一个是自我介绍,基本到哪都少不了,是时候准备一段高大上的了;一个是数据结构和算法,对于我这样一个以后倾向于做开发的孩纸,这是绕不过的门槛,不论我有多少理由告诉用人单位我现在的环境中很难有机会用上这两样神器,用人单位一样有更多理由告诉我,你要是连这都不懂,我们这不需要你!剩下的半年时间一定要抽空好好补补这方面的东西了!

       有些东西可能曾经很熟,但是久了不碰,也会生。适当回顾一下网络方面的东西,加固一下自己的长处,也是很有必要的。

       以前只是一直听说、想象面试是怎么样的,只有真正经历过,才知道,它其实也就这么回事。这次的经历,让我对“面试”有了更直观的体会,减小了我的心理恐惧,对于公司比较关心的问题有了部分认识,不至于求职的时候一抹黑。

       最后不得不说的是,B公司不愧是我们国内的行业翘楚,员工素质挺不错的~~~特别要给B公司的三位面试官点个赞,他们营造了一个相对轻松的面试氛围,让我不至于太紧张。更感谢的是,他们针对我的具体情况,给了我很多建议,让我很受启发。灰常感谢B公司这次实习招聘!

转载于:https://my.oschina.net/floristgao/blog/1865959

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值