诺瓦星云面试汇总
3、epoll将主动轮询变成被动通知,当有事情发生时,接收到通知后再去处理,也就是epoll会把哪个流发生哪种i/o事件通知我们,epoll是事件驱动(每个事件关联到fd),epoll底层是红黑树,epoll内部使用事件驱动的机制,内核中维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核将其加入到就绪事件链表中,当用户调用epoll_wait()函数时,只会返回有事件发
目录
17、spi(多少根线,时序等) iic(多少根线,时序等)
29、linux内核,TCP/IP中源socket怎么回事,三种socket报文模式
1、C语言向一个内存地址写值,
int main() {
int value = 42;
int *ptr = (int *)0x12345678; // Replace with the desired memory address
*ptr = value
2、申请释放内存
申请内存
int *dynamicArray = (int*)malloc(size *sizeof(int));
释放内存
free(dynamicArray)
3、makefile
makefile 我只会模仿改写makefile的基本思路 是查第一行目标文件有没有的依赖文件,如果没有,就在下面的代码的目标文件中查找,有就执行相应的代码
clean:
rm -f myprogram
行make clean
就会执行clean
目标,删除名为myprogram
的文件
all: main.c utils.c (all 默认)
gcc -o myprogram main.c utils.c
test: myprogram(test 目标名字 myprogram 依赖名字)
./myprogram test_input.txt
执行make 执行all下命令
执行 make test 执行test下命令
引入库
1、写好路径
2、库和路径添加到链接命令中
导入模板
include common.mk ,这样makefile就导入模板了
4、socket I/O复用
select函数,可以监听的数目有限制,并且每次都调用select函数的时候都需要将fd集合从用户态拷贝到内核态 ,同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
2、po'll 开销也比较大,但是因为fd使用链表这样的话,数目限制就不存在了
3、epoll将主动轮询变成被动通知,当有事情发生时,接收到通知后再去处理,也就是epoll会把哪个流发生哪种i/o事件通知我们,epoll是事件驱动(每个事件关联到fd),epoll底层是红黑树,epoll内部使用事件驱动的机制,内核中维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核将其加入到就绪事件链表中,
当用户调用epoll_wait()函数时,只会返回有事件发生的文件描述符的个数,不需要像select和poll那样进行轮询,大大提高了检测的效率
5、strcpy与strcat
strcpy 地址拷贝
strcat 值拷贝
6、内存的分配
1、堆(地址从上到下递减)
2、栈(地址从上到下递增)
3、全局变量区\静态变量区(未初始化bss 初始化data)
4、文本区(代码本文 + 常量)
7、new 和 malloc
两个分配的都是在堆空间,new 不需要指定空间大小,new 分配完还会调用构造函数初始化
8、Tcp和udp的区别
TCP不能直接传输,需要连接具有可靠性,适合高质量传输,但是速度慢
UDP可以直接传输,但是不安全,速度也快
9、嵌入式linux的调试方式
应用中 printf
驱动内核中 printk
gdb调试运行
10、iic 上拉电阻的作用
1、高电平
2、开漏输出
11、指针常量与常量指针
指针常量 :指针是一个常量,指针指向不能变
常量指针:指针指向的是一个常量
12、内存泄漏
是指程序在申请内存后无法释放已申请的内存空间,导致系统无法及时收回内存并且分配给其他进程使用
1、动态分配的内存没有被释放:当使用关键字
new
或malloc
分配内存时,应该使用对应的delete
或free
函数来释放内存。如果没有正确释放,就会导致内存泄漏2、丢失对分配内存的指针
3、c++中子类析构函数没有设置为虚函数
13、野指针
野指针不是NULL指针,是指向被释放的或者访问受限的内存的指针
1、指针变量没有被初始化,任何刚创建的指针不会自动成为NULL
2、指针被free或delete之后,没有置NULL
3、指针操作超越了变量的作用范围,比如要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放
14、链表和数组的区别
访问元素效率:
数组:由于数组的元素在内存中是连续存储的,访问元素的效率非常高,只需要通过索引即可。
链表:链表的元素分散在内存中不同位置,访问元素需要按照节点指针的顺序遍历,效率较低。
15、反转链表
需要三个指针,一个pre指针指向反转的前一个节点,cur指向要反转的节点,然后设置有一个temp指针指向需要反转的下一个节点,用来使得cur指针移动,因为我们反转之后,无法使用next指针访问到后一个节点
16、Linux gcc编译命令
1、预处理
gcc -E hello.c -o hello.i
(头文件展开,进行源文件中的宏替换,注释过滤)2、编译
gcc -S hello.i -o hello.s
(将源文件编译成汇编文件)3、汇编
gcc -c hello.s -o hello.o
(将汇编文件转换成二进制文件)4、链接
gcc hello.o -o hello
(将二进制文件打包成可执行文件
17、spi(多少根线,时序等) iic(多少根线,时序等)
18、有没有用过示波器,逻辑分析仪
19、说一下server端网络编程的步骤
20、static,const,volatile关键字
21、static关键字在c语言中和c++中有何不同
类的静态成员变量和函数: 在 C++ 语言中,
static
关键字被广泛用于类的静态成员变量和静态成员函数。静态成员变量是类的所有对象共享的变量,而静态成员函数不属于任何特定对象,可以直接通过类名调用。函数内的静态变量: C++ 中的函数内的静态变量的作用与 C 语言类似,仍然将变量的作用域限制在函数内,并保持其值在函数调用之间不变。
命名空间中的静态变量: 在 C++ 中,
static
关键字还可以用于命名空间内的静态变量,这将限制变量的作用域在命名空间内,并且在不同文件中可以共享
22、问了一个结构体问占用内存大小,如何改变内存大小(更改成员变量位置,或者取消结构体对齐)
23、栈和队列的区别
24、编译完的程序在内存中的分布
25、如果大量频繁的申请堆空间会发生什么?
内存泄漏
堆碎片化
性能下降
系统崩溃
29、linux内核,TCP/IP中源socket怎么回事,三种socket报文模式
源socket"通常指的是套接字(socket)的一个端点
三种报文形式
面向连接的套接字(SOCK_STREAM)面向消息的套接字(SOCK_DGRAM)
原始套接字(Raw Socket
30、共享内存函数
31、内存拷贝函数与字符串拷贝函数
memcpy()
:用于从源内存地址复制一定数量的字节到目标内存地址。字符串拷贝 strcpy
32、查找文件的命令
find /path/to/search -name "filename.ext"
33、管道
linux 命令中的管道
了命令行中的管道(
|
)用于将一个命令的输出连接到另一个命令的输入外
34、内核与用户的转换
1、中断
2、异常
3、系统调用
35、互斥量与信号量的底层
通常涉及原子操作和线程阻塞。
36、OSL七层模型、五层模型
37、冒泡排序
38、查看tty设备方法
39、数组与指针的区别
数组的大小固定,而指针可以动态指向不同的数据。
内存布局:数组的元素在内存中是连续存储的,而指针可以指向任何内存位置。
访问方式:数组通过下标直接访问元素,而指针需要通过解引用操作来访问所指向的数据。
声明方式:数组声明时需要指定大小和数据类型,而指针声明只需要指定数据类型。
更多推荐
所有评论(0)