VMware电话面试

1 分钟读完

这次VMware电话面试聊了30多分钟,主要涉及四个方面C语言,Python,Linux,TCP/IP. 详细考查知识点如下:

##1.C语言 ####1.1 static 主要有两个作用

  • 函数内声明的static变量,在多次调用之间保持其值,不会重新初始化;
  • 全局static变量/函数对其他源文件不可见,只能在声明它的源文件中使用;

example

####1.2 extern

跨源文件共享全局变量/函数,它仅仅是用来声明,其声明的变量一定要在其它源文件中定义,而且不能有static声明;

example

####1.3 #include<>与”“区别

  • 用<>导入的头文件会在系统库目录里去查找这个头文件;
  • 用”“表示首先在当前目录下去找个头文件,如果没找到再去系统库里去查找这个头文件;

####1.4 头文件保护 header/include guard避免头文件重复包含

  #ifndef FOO_BAR_BAZ_H_
  #define FOO_BAR_BAZ_H_
  
  ...
  
  #endif  // FOO_BAR_BAZ_H_

####1.5 字节对齐 有一个struct定义如下

struct T{
  char a;
  short b;
  int c;
};   

问在一个32位系统上,sizeof(struct T)返回多少?

正确答案是8,而不是7. 详细解答见C语言字节对齐

####1.6 递归 一个递归函数,如果没有递归出口会出现什么情况?

如果没有递归出口,那么会导致函数陷入无尽的自我调用之中,函数调用栈中栈帧急剧增加,最终导致栈溢出/栈击穿,程序崩溃。

####1.7 函数调用栈

被调用函数:callee
调用函数:caller

  • callee的参数
  • callee的返回地址
  • caller栈空间的基址EBP
  • callee的局部变量
  • callee的buffer
  • callee保存的寄存器状态

参考

##2.Python

####2.1 tuple和list的区别 主要区别就是tuple是不可变对象,而list是可变的

注:还有数字和字符串,对一个变量进行两次不同的赋值,表现上是可变的,实际上是新建的对象,可以用id()查看

####2.2 tuple和list可以做dict的key吗 tuple可以,而list不可以
dict是通过对key进行hash,来找到value. 这里就要保证同一个key的hash值是确定的,不能变来变去,即要求key是不可变对象。
所以tuple可以作为字典的key, list却不行。

####2.3 正则表达式 python的regex模块re,search和match的区别?
re.match只匹配字符串的开始,而re.search匹配整个字符串

>>> import re
>>> p = "abc"
>>> re.match(p,"abcdef")
<_sre.SRE_Match object at 0x0000000002D52578>
>>> re.match(p,"babcdef")
>>> re.search(p,"abcdef")
<_sre.SRE_Match object at 0x0000000002D52510>
>>> re.search(p,"babcdef")
<_sre.SRE_Match object at 0x0000000002D52578>
>>> 

re.match("abc", "abcdef") 相当于 re.search("^abc", "abcdef")

####2.4 调用工具pdb 这个我没用过,参考Python代码调试技巧

有几个月没有用Python, 好多知识点都忘了,答的不好,所以Python这块问的不多。

##3.Linux

####3.1 进程资源回收

问:用fork()创建子进程, 父进程如何等子进程结束,然后回收子进程的资源?
答:子进程中止会向父进程发送SIGCHLD信号,父进程可以用signal()捕获该信号,然后调用wait()/waitpid()来清理子进程。 问:父进程先于子进程终止,会导致什么结果? 答:子进程会变成孤儿进程/僵尸进程,然后由init进程收养。

参考

####3.2 from ring3 to ring0 Linux进程空间分为用户态和内核态两种,如何实现用户态到内核的切换?

- 系统调用(trap/system call)
- 中断(interrupt)
- 异常(如page fault)

####3.3 动态链接与静态链接的区别

  • 静态链接是在编译期间由链接器将不同的目标文件链接起来,生成的可执行文件体积较大;Linux下静态链接库一般是*.a文件;
  • 动态链接是在运行时进行链接,生成的可执行文件体积较小;Linux下静态链接一般是*.so文件;
  • 静态链接生成的可执行文件在运行时不会依赖其他库,配置简单;动态链接依赖其他库,需要在运行时进行符号重定位,配置不同的so相对复杂;

####3.4 如何查看程序所需要的动态链接 ldd 查看ldd帮助文档
print shared library dependencies

####3.5 如何查看一个动态链接库的函数 objdump -T nm -D都可以查看动态符号表

  • man nm: list symbols from object files
  • nm -D: Display the dynamic symbols ...
  • man objdump: display information from object file
  • objdump -T: print the dynamic sybmbol table entries of the file

目标文件格式分析工具: ar, nm, objdump, objcopy, readelf

####3.6 coredump文件

coredump文件是Linux程序由于各种异常或者bug导致在运行过程中异常退出或者中止时产生的。 coredump文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等. ——coredump详解

个人使用coredump文件的经历是 gdb ./exefile core
然后用bt查看函数调用栈信息。

core文件一般是默认关闭的,即core文件大小限制为0,至少在ubuntu下是这样,需要在root下执行

ulimit -c unlimited

注意ubuntu下 sudo ulimit -c unlimited是不行的。

##4.TCP/IP

####4.1 IP报头

uint8_t 	ip_hdr_len:4
 	The header length. 
uint8_t 	ip_version:4
 	The IP version. 
uint8_t 	ip_tos
 	Type of Service. 
uint16_t 	ip_len
 	IP packet length (both data and header). 
uint16_t 	ip_id
 	Identification. 
uint16_t 	ip_off
 	Fragment offset. 
uint8_t 	ip_ttl
 	Time To Live. 
uint8_t 	ip_proto
 	The type of the upper-level protocol. 
uint16_t 	ip_chk
 	IP header checksum. 
uint32_t 	ip_src
 	IP source address (in network format). 
uint32_t 	ip_dst
 	IP destination address (in network format). 

####4.2 TCP建立连接 三次握手

####4.3 TCP关闭连接 四次握手

这块比较熟悉,还把TCP报头的flags说到IP报头了,囧啊。

##5.其他

  • 有没有编写过驱动
  • 目前在做的项目
  • 我询问了下工作内容

标签:

分类:

更新时间:

留下评论