嵌入式软件工程师/linux c程序员 面试经验总结

2019-07-12 20:39发布


最近也没有时间写博客,原因简单,忙着找工作,一天面试2-3家,早出晚归一天累的死去活来,混口饭吃真TM的不容易啊!在上一家公司日子比较清闲也没什么大项目,在空闲和业余时间我先后熟读了《Unix环境高级编程》、《Unix进程间通信》、《大话数据结构》、《Unix网络编程》最后一本还没来得急看完,个人理解做应用开发就这四方面的知识就够了。其次你想练练C语言功底得读读《c陷阱》、《c专家编程》、《c和指针》、还有一本功能书《c primer plus中文版》还有很多好书不一一列举。我换工作的目的很简单,作为北漂一族为别人打工无非两点:第一、为钱,工资待遇好,干什么并不重要。第二、能学到本事。我可能属于第三种,既没有好的待遇,也学不到东西,所以我毅然决然的辞掉了工作,苦逼的屌丝生活不是我想要的。找工作其实挺简单,但是要想找个好工作难,没有学历,没有能力就难上加难了。在北京这PM2.5天天爆表的城市里,牛人太多太多,你不出去走走永远不知道自己有多么的渺小(不是自卑),随处可见拿着5位数工资的人。在北京这种人人都像被打了鸡血一样的城市,你不努力迟早被淘汰,现实就是这样,打住..........有时候你必须得把心态放宽些,走好脚下的路,世界上多数人都是普普通通的,只有极少数人能成功。我们不能人云亦云,大多数人认为是对的不一定对,大多数人认为是错的它不一定错。有句古话叫“机会掌握在少数人手中!”,我们在社会的大潮中做人做事必须时时刻刻过过自己的脑子。 最后说说面试经验:对程序员来说无非两点:第一、笔试,第二、面试。 笔试,笔试这东西就靠硬功夫了,靠自己平时的编程积累,和临场的随机应变(有时候面试官会临时出个题目给你)。可以在网上下载些相关的资料做做,一般公司的笔试题都是十分简单的,对于有工作经验的是人来说就是一个简单的参考。 面试,面试这玩意真不好说,有时候还的看人品。每个面试官都有自己的性格,他们通常会根据自己的性格喜好和公司的团队氛围来估量面试者是否合适,过了初试那关,这面试就显得十分重要。对于程序员面试的时候通常面试官会根据你的简历问一些相关的项目,他会根据公司岗位要求技能对你进行考察,你得事先做好充分的准备:第一、查看HR给的发的岗位要求,因为这些要求是面试的时候肯定会被问到的。第二、了解公司行业所从事的方向,自己估量会用到哪些技术。第三、结合岗位要求重点想想自己有没有做过这方面的项目,到时候任由你发挥。第四、面试的时候一定要从容自信(我做的还不够),最好面带笑容这样不但能缓解气氛,也能给面试官留下好影响。 以上内容纯属个人见解,下面贴上2013年3月13号-2013年3月26号中面试所遇到的题目,很简单这里拿来与大家分享。下周一就要上班了,面试我的是个大美女,心理暗喜,最后希望自己在新公司能尽快的融入团队、能快速的定位自己、不断的成长和提高,好好工作,幸福生活每一天!
一、什么叫可重入?
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是
可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断
它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么
错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,
中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是
不能运行在多任务环境下的。
二、tcp/IP三次握手?
1.首先客户端通过向服务器端发送一个SYN来建立一个主动打开,作为三
路握手的一部分。(同步位为1)
2. 然后服务器端应当为一个合法的SYN回送一个SYN/ACK。(同步位和确
认位都为1)
3. 最后,客户端再发送一个ACK。这样就完成了三路握手,并进入了连接
建立状态。(确认位位1)

三、TCP/IP通信阻塞和非阻塞?
阻塞:当socket的接收缓冲区中没有数据时,read调用会一直阻
塞住,直到有数据到来才返回。当socket缓冲区中的数据量小于期望读取
的数据量时,返回实际读取的字节数。当socket的接收缓冲区中的数据大于
期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度。
非阻塞:socket的接收缓冲区中有没有数据,read调用都会立刻返回。接收
缓冲区中有数据时,与阻塞socket有数据的情况是一样的,如果接收缓冲区
中没有数据,则返回错误号为EWOULDBLOCK,表示该操作本来应该阻塞的,但
是由于本socket为非阻塞的socket,因此立刻返回,遇到这样的情况,可
以在下次接着去尝试读取。如果返回值是其它负值,则表明读取错误。
因此,非阻塞的rea调用一般这样写:
if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示没有读到数据
}
else 
return -1; //表示读取失败
}else return nread;  //读到数据长度

四、TCP/UDP区别?
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器
彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP
提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端
传到另一端。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠
性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达
目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有
超时重发等机制,故而传输速度很快

五、林锐内存思考?
(1)
void GetMemory(char *p) 
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
答:程序崩溃因为GetMemory并不能
传递动态内存,Test函数中的 str一
直都是NULL
strcpy(str, "hello world");
将使程序崩溃 

(2)
char *GetMemory(void) 
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
答:可能是乱码 因为GetMemory返回的
是指向栈内存的指针,该指针的地址
不是 NULL,但其原现的内容已经被清
除,新内容不可知

(3)
void GetMemory2(char **p, int num) 
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
答: (1)能够输出hello (2)内存泄漏没有free

(4)
void Test(void) 
{
char *str = (char *) malloc(100);
strcpy(str, hello);
free(str);
if(str != NULL)
{
strcpy(str, world);
printf(str);
}
}
答:篡改动态内存区的内容,后果难以
预料,非常危险 因为free(str);之后
str成为野指针,if(str != NULL)语句
不起作用

六、编写各种str函数?
strcpy函数
char *my_strcpy(char *dest, const char *src)
{
char *temp;

assert(dest!=NULL && str != NULL);
while((*dest++ = *src++) != '