笔试题:指针常量与常量指针、类型字节数、中断类型、DHCP、宏与函数、epoll与select、DML、死锁、双向链表基本操作

指针常量
int *const a;

常量指针
int const* a;

指向常量的指针
const int * a;

笔试题:指针常量与常量指针、类型字节数、中断类型、DHCP、宏与函数、epoll与select、DML、死锁、双向链表基本操作_第1张图片
中断的类型(缺页中断属于程序性中断)
1.软中断/内中断
2.外中断/硬件中断
3.异常
什么是缺页中断?
进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。

动态主机配置协议DHCP
为主机分配IP地址
DHCP也被称为即插即用协议(plug-and-play protocol)
当有一台主机加入时,DHCP服务器从其当前可用的地址池中分配一个任意地址给它;当一台主机离开时,其地址便被收回到这个池中。
https://blog.csdn.net/qq_42248536/article/details/89714643

宏与函数的区别
1.宏一般只做简单替换,不会对其进行语法检测
2.宏定义一般用于简单文本或字符串的替换,宏函数。
3.宏不能出现递归。
4.当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

宏与函数对比的优点如下:
1、宏比函数在程序的规模和速度方面更胜一筹;
2、宏是类型无关的。

当然宏和函数对比时,也有一些缺点:
1、除非宏比较短,否则可能大幅增加程序的长度;
2、宏是没法调试
的;
3、宏由于类型无关,也就不够严谨;
4、宏可能会带来运算符优先级的问题,导致程序易出错。

epoll 相对于select的优势
1.支持一个进程打开大数目的socket描述符
2.IO效率不随FD数目增加而线性下降
3.使用mmap加速内核与用户空间的消息传递
https://blog.csdn.net/linuxheik/article/details/52150323

DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
https://blog.csdn.net/srd1900/article/details/46931955

什么是死锁?产生的原因?必要条件?
1.所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
2.a竞争资源(不可剥夺资源/竞争临时资源),b.进程间推进顺序非法

3.互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。

https://blog.csdn.net/hd12370/article/details/82814348

c语言中,if(x==5)写成if(x=5)的话,那么判断为永真
相当于if(true),不管x是否等于5,if都判断为真,导致程序逻辑不正确

双向链表的基本操作
https://blog.csdn.net/qq_39032310/article/details/81735251

//
#include 
#include 
#include 

//
 typedef int datatype;
 typedef struct node{
     datatype data;
     struct node* last;
     struct node*next;
}doublelistnode;

//
doublelistnode* creatlist()
{
      doublelistnode* list=(doublelistnode*)malloc(sizeof(doublelistnode));
      list->next=list->last=list;
      list->data=-1;
      return list;
}

//
doublelistnode* creatnode(datatype data)
{
    doublelistnode* node=(doublelistnode*)malloc(sizeof(doublelistnode));
    node->data=data;
    node->last=node->next=node;
    return node;
}


//
int listisempty(doublelistnode* L)
{
    if(L->last==L->next) 
    {
    return 1;
    } 

    return 0;
}
//
void printlist(doublelistnode* L)
{
    if(listisempty(L))
    {
   printf("链表为空\n");
    }
L=L->next;
while(L->data!=-1)
{
printf("%d-->",L->data);
L=L->next;

}
printf("\n");
}




你可能感兴趣的:(面试)