2016年9月28日深信服C/C++开发面试问题

个人能力比较差,一面就被刷了,但还是想发出来让以后面试的人有所准备,后面会陆续将答查找案附上,仅做参考,若有错误,希望及时指证
1、系统调用与函数调用
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。

2、linux信号有哪些
常用信号
信号    值    动作解释
SIGHUP    1    终端线路挂断
SIGINT    2    Term键盘输入的中断命令,从终端输入 Ctrl-C 时发生
SIGQUIT    3    Core键盘输入的退出命令
SIGILL    4    Core错误指令
SIGABRT    6    Coreabort(3)发出的中止信号
SIGFPE    8    Core浮点数异常
SIGKILL    9    TermKILL信号
SIGSEGV    11    Core非法内存访问
SIGPIPE    13    Term管道断开
SIGALRM    14    Termalarm(2)发出的中止信号
SIGTERM    15    Term强制中止信号
SIGUSR    130,10,16    Term用户自定义信号1
SIGUSR    231,12,17    Term用户自定义信号2
SIGCHLD    20,17,18    Ign子进程中止信号
SIGCONT    19,18,25    Cont继续执行一个停止的进程
SIGSTOP    17,19,23    Stop非终端来的停止信号
SIGTSTP    18,20,24    Stop终端来的停止信号
SIGTTIN    21,21,26    Stop后台进程读终端
SIGTTOU    22,22,27    Stop后台进程写终端

3、可重入函数,线程安全
主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。

5、阻塞与非阻塞
阻塞是指在函数执行时如果条件不满足,程序将永远停在那条函数那里不在往下执行,而非阻塞则是函数不管条件是否满足都会往下执行.

6、可变参数函数的定义及实现
通常我们使用的C函数的参数个数都是固定的,但也有不固定的,参数个数由使用者确定的即可变参数函数

C函数要在程序中用到以下这些宏:

void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );


va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明
va_list类型的一个对象       定义: typedef char *  va_list;
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和
va_end使用;
va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改
用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;
va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。
va在这里是variable-argument(可变参数)的意思.
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值.

  1. #include <stdio.h>;
  2. #include <string.h>;
  3. #include <stdarg.h>;
  4. /* ANSI标准形式的声明方式,括号内的省略号表示可选参数 */
  5. int demo(char *msg, ... )
  6. {
  7. va_list argp; /* 定义保存函数参数的结构 */
  8. int argno = 0; /* 纪录参数个数 */
  9. char *para; /* 存放取出的字符串参数 */
  10. /* argp指向传入的第一个可选参数,    msg是最后一个确定的参数 */
  11. va_start( argp, msg );
  12. while (1)
  13. {
  14. para = va_arg( argp, char *); /*    取出当前的参数,类型为char *. */
  15. if ( strcmp( para, "\0") == 0 )
  16. /* 采用空串指示参数输入结束 */
  17. break;
  18. printf("Parameter #%d is: %s\n", argno, para);
  19. argno++;
  20. }
  21. va_end( argp ); /* 将argp置为NULL */
  22. return 0;
  23. }

  24. void main( void )
  25. {
  26. demo("DEMO", "This", "is", "a", "demo!" ,"333333", "\0");
  27. }


从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针.
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数.
3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个参数是你要返回的参数的类型,这里是int型.
4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获取各个参数.

可变参类型陷阱

下面的代码是错误的,运行时得不到预期的结果:

view plaincopy to clipboardprint?
va_start(pArg, plotNo);
fValue = va_arg(pArg, float);  // 类型应改为double,不支持float
va_end(pArg);
va_start(pArg, plotNo);
fValue = va_arg(pArg, float);  // 类型应改为double,不支持float
va_end(pArg);

下面列出va_arg(argp, type)宏中不支持的type:

—— char、signed char、unsigned char
—— short、unsigned short
—— signed short、short int、signed short int、unsigned short int
—— float

在C语言中,调用一个不带原型声明的函数时,调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。该规则同样适用于可变参数函数——对可变长参数列表超出最后一个有类型声明的形式参数之后的每一个实际参数,也将执行上述提升工作。

提升工作如下:
——float类型的实际参数将提升到double
——char、short和相应的signed、unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int

然后,调用者将提升后的参数传递给被调用者。

所以,可变参函数内是绝对无法接收到上述类型的实际参数的。

7、缓冲溢出报警及解决
8、内存溢出解决
9、malloc和new分配内存区别
10、一棵树转换成二叉树
11、如何比较两个结构体是否相等
12、main函数返回值意义及获取方式
13、快排原理,什么时候复杂度最高及如何改进
14、云盘中秒传功能是什么原理,说说其中一个算法

全部评论
好帖
点赞
送花
回复
分享
发布于 2015-09-29 22:36
感谢,分享~~
点赞
送花
回复
分享
发布于 2015-10-07 16:22
滴滴
校招火热招聘中
官网直投
感谢,分享~~
点赞
送花
回复
分享
发布于 2015-10-07 16:22
楼主有心了,还持续更新
点赞
送花
回复
分享
发布于 2015-10-11 23:30
楼主好人一生顺利!!!
点赞
送花
回复
分享
发布于 2016-10-08 15:32
多谢楼主
点赞
送花
回复
分享
发布于 2016-12-04 09:03
楼楼,敢问这些知识点都是哪本书上的啊。。。。我怎么感觉和C++没关系啊。。。。。
点赞
送花
回复
分享
发布于 2017-04-30 11:28
楼主还在上学就开始面试了?还懂这么多东西
点赞
送花
回复
分享
发布于 2018-04-07 11:55

相关推荐

18 90 评论
分享
牛客网
牛客企业服务