广州CVTE2018嵌入式软件工程师笔试题
嵌入式Linux工程师笔试记录 -- 2020.8.12
1. 考察文件打开方式:
open
方式 | 作用 |
---|---|
O_RDONLY | 只读打开 |
O_WRONLY | 只写打开 |
O_RDWR | 读写打开 |
O_CREAT | 文件不存在则创建文件 |
O_TRUNC | 存在则清零 |
O_APPEND | 以追加方式打开 |
O_NONBLOCK | 非阻塞方式打开 |
fopen
方式 | 作用 |
---|---|
r / rb | 只读打开 |
w / wb | 只写打开 |
r+ / w+ / rb+/ wb+ | 读写打开 |
a / ab | 追加方式打开 |
a+/ab+ | 追加方式打开,可读可写 |
2. 谈谈COM的线程模型。然后讨论进程内/外组件的差别。
以下来自《COM原理与应用》一书
COM线程模型:
- COM规范本身没有定义特有线程模型,但因为在Win32平台上程序的运行是以线程为单位的,但线程环境与多线程环境下的客户程序或COM应用程序,情况有所不同。Win32有两种线程:UI线程和辅助线程,COM与之对应为套间线程和自由线程。
- COM对象运行在套间线程中,该对象属于此套间线程所有,并永远运行在此线程中。虽然线程供用一个进程地址空间,套间线程的"套间"的概念与进程一致,套间线程中的COM对象不需要进行同步处理,但线程外调用只能通过代理/存根调用套间线程的对象。
- COM对象运行在自由线程中,那么同一进程中其他线程可以直接调用该对象成员函数。但对象成员函数必须进行同步处理,以保证其线程安全特性。
- 依据以上概念,一个进程可以包括多个线程,这些线程可以是套间线程,也可以是自由线程。所有的自由线程组合形参自由线程组。有时会将套间线程称为单线程公寓(STA),将自由线程组称为多线程公寓(MTA),所以一个进程中只能由一个MTA,可以由多个STA。
进程内/外组件的差别:
进程内组件通常是动态链接库(DLL)形式。动态链接库是在执行过程中动态装入到进程的内存空间,当不需要时,系统可以把动态链接库卸出内存,以便释放内存供其他程序使用。进程内组件和客户程序执行在同一进程地址空间中,所以一旦客户程序与组件程序建立通信关系后,客户程序直接调用组件接口,效率非常高;但同时,组件程序中的严重错误会直接导致客户程序崩溃。
进程外组件运行独占一个进程,与客户程序互相独立,并且可以位于不同机器上(远程组件)。本地组件一般为EXE程序,远程组件可以是DLL,也可以是EXE。客户程序调用进程外组件显然涉及到进程间通信,甚至在不同机器上要涉及网络过程的调用,效率相对会比较低,但是更加稳定。
3. 多态类中的虚函数表建立时机?
虚函数表是在编译时期建立的,各个虚函数编译时组成一个虚函数入口地址数组,而对象的虚函数表指针式在运行期,也就是在构造函数被调用的时候进行初始化的,这是实现多态的关键。
4. 判别一个数式unsigned
#define ISUNSIGNAL(x) ( ( (x)>=0 && ~(x)>=0 ) ? 1 : 0 )
// 1:无符号 2:有符号
5. 已知一个数组table,用一个宏定义,求出数据的元素个数
#define NTBL ( sizeof(table) / sizeof(table[0]) )