先说说流程吧,下午到那边后,立即做题,做到3点左右,笔试过了,就立刻安排面试,给我面试的哥们感觉跟我年龄差不多,大概免了一个小时吧,最后一个应该是公司主管吧,又免了一个小时,累呀。。。不过说效率真的很高,最后等通知。
笔试环节:
主要考C语言基础,内存管理,树,森林,堆栈等算法,100分试卷,比较头疼的是不定项选择,单选还好。一般的基础好点,都能过掉这关。
面试环节:
考的好细节,以前写程序没考虑过的问题,都会问你,我把题目整理下:大概是67个题目吧
1,定义函数指针,里面有两个参数(int,char *),返回值为整形
实在是没听懂面试官说的意思,可能是刚做完笔试题,头晕晕的,考点是#define 和 typedef。
2,考linux驱动相关的一些基础命令,比如加载驱动的两个命令,卸载驱动等
这个平时写程序用到的命令,应该都会过的。
3,linux中重要的三个结构体,关系
file_operation,node,file,这个关系我说的不好,file_operation就是把系统调用和驱动程序关联起来的关键数据结构;struct file代表一个打开的文件,在执行file_operation中的open操作时被创建;struct inode被内核用来代表一个文件,注意和struct file的区别,struct inode一个是代表文件,struct file一个是代表打开的文件;通过inode可以设备号;
4,字符串翻转,不申请额外空间
引申:"I AM STUDENT" => ''STUDENT AM I" 怎么实现?
很简单,先整体翻转,在局部翻转;
5,linux驱动中,close(),release(),区别;
release对应的就是close函数,对某些设备,当用户使用close时,最终会调用release函数,实际上open和release不需要具体实现什么,一般会作为一个计数,就是有多少人次访问该设备,也可以通过open和release实现同一时间只能有一个用户访问该设备等等。内核驱动没有close,release相当于close,对于open,当关闭文件时调用release。
6,用什么方法可以实现二叉树的先序遍历;
用栈,要考虑出栈,入栈
复试环节:
首先跟你聊聊想去哪里工作,你的毕业课题,目前在座的工作,为什么来到这个公司,最后完成一个编程题:
对于utf8变长编码,统计字符数;
例如:输入 aaa a韩国
输出 count = 7
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <stdio.h>
static int Fd_TextFile;
static unsigned char *TextFileMem;
static unsigned char *TextFileStart;
static unsigned char *TextFileMemEnd;
static int count = 0;
static int ilen_head = 3;
static int GetPreOneBits(unsigned char ucVal)
{
int i;
int j = 0;
for (i = 7; i >= 0; i--)
{
if (!(ucVal & (1<<i)))
break;
else
j++;
}
if(j == 0)
j = 1;
return j;
}
int main(int argc,char *argv[])
{
struct stat tStat;
int iNum;
unsigned char ucVal;
Fd_TextFile = open(argv[1], O_RDONLY);
if (0 > Fd_TextFile)
{
printf("can't open text file %s\n", argv[1]);
return -1;
}
if(fstat(Fd_TextFile, &tStat))
{
printf("can't get fstat\n");
return -1;
}
TextFileMem = (unsigned char *)mmap(NULL , tStat.st_size, PROT_READ, MAP_SHARED, Fd_TextFile, 0);
if (TextFileMem == (unsigned char *)-1)
{
printf("can't mmap for text file\n");
return -1;
}
TextFileMemEnd = TextFileMem + tStat.st_size;
TextFileStart = TextFileMem + ilen_head;
while(1)
{
ucVal = *TextFileStart;
iNum = GetPreOneBits(ucVal);
//printf("iNum = %d \n",iNum);
count += 1;
if ((TextFileStart + iNum) >= TextFileMemEnd)
{
/* 文件结束 */
printf("count = %d \n",count);
return count;
}
if (TextFileStart >= TextFileMemEnd)
{
/* 文件结束 */
printf("count = %d \n",count);
return count;
}
TextFileStart += iNum;
}
}