这次VMware电话面试聊了30多分钟,主要涉及四个方面C语言
,Python
,Linux
,TCP/IP
. 详细考查知识点如下:
主要有两个作用
跨源文件共享全局变量/函数,它仅仅是用来声明,其声明的变量一定要在其它源文件中定义,而且不能有static声明;
header/include guard
避免头文件重复包含
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
有一个struct定义如下
struct T{
char a;
short b;
int c;
};
问在一个32位系统上,sizeof(struct T)返回多少?
正确答案是8,而不是7. 详细解答见C语言字节对齐
一个递归函数,如果没有递归出口会出现什么情况?
如果没有递归出口,那么会导致函数陷入无尽的自我调用之中,函数调用栈中栈帧急剧增加,最终导致栈溢出/栈击穿,程序崩溃。
被调用函数:callee
调用函数:caller
主要区别就是tuple是不可变对象,而list是可变的
注:还有数字和字符串,对一个变量进行两次不同的赋值,表现上是可变的,实际上是新建的对象,可以用id()查看
tuple可以,而list不可以
dict是通过对key进行hash,来找到value. 这里就要保证同一个key的hash值是确定的,不能变来变去,即要求key是不可变对象。
所以tuple可以作为字典的key, list却不行。
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")
这个我没用过,参考Python代码调试技巧
有几个月没有用Python, 好多知识点都忘了,答的不好,所以Python这块问的不多。
问:用fork()创建子进程, 父进程如何等子进程结束,然后回收子进程的资源?
答:子进程中止会向父进程发送SIGCHLD信号,父进程可以用signal()捕获该信号,然后调用wait()/waitpid()来清理子进程。
问:父进程先于子进程终止,会导致什么结果?
答:子进程会变成孤儿进程/僵尸进程,然后由init进程收养。
参考 - Linux 避免僵尸进程 - 孤儿进程
Linux进程空间分为用户态和内核态两种,如何实现用户态到内核的切换?
- 系统调用(trap/system call)
- 中断(interrupt)
- 异常(如page fault)
ldd
查看ldd帮助文档
print shared library dependencies
objdump -T
和nm -D
都可以查看动态符号表
list symbols from object files
Display the dynamic symbols ...
display information from object file
print the dynamic sybmbol table entries of the file
目标文件格式分析工具: ar, nm, objdump, objcopy, readelf
coredump文件是Linux程序由于各种异常或者bug导致在运行过程中异常退出或者中止时产生的。 coredump文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等. ——coredump详解
个人使用coredump文件的经历是
gdb ./exefile core
然后用bt查看函数调用栈信息。
core文件一般是默认关闭的,即core文件大小限制为0,至少在ubuntu下是这样,需要在root下执行
ulimit -c unlimited
注意ubuntu下 sudo ulimit -c unlimited
是不行的。
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).
这块比较熟悉,还把TCP报头的flags说到IP报头了,囧啊。