卫士通Linux C面试笔试题

试题一:用C语言或C++语言实现行程压缩的压缩

关于行程压缩:如原文为”111AAKKKK”,则压缩后为”13A2K4″,即用代码和代码重复的次数来表示原始信息,实现一个简单的压缩功能。

void decoder(char * dest, char * src) {

    int _num=0;

    while( *src != ‘\0′) {

        _num =*(src+1) – 0×30;

        memset(dest, *src, _num);

        dest+=_num;

        src+=2;

    }

}

以上函数有以下假设:

    1. dest与src指针均不为NULL

    2. dest的存储空间足够大

 

####################

以下A\B组试题任选一组:

A组:

试题二:简述一下ping命令在协议层面的操作过程(涉及哪些二层及以上协议以及相关协议对ping的简单的处理过程),并说出在直接配置路由和配置缺省网关这两种情况下,ping在协议层面操作过程有什么不同?

 

试题三:以TCP为例,简述一下C\S程序设计的原理和实现过程。

 

试题四:简述一下TCP连接建立时三次握手的过程。

 

B组:

试题二:简述一下Linux操作系统中断处理的原理和使用方法。

 

试题三:简述一下Linux操作系统内核的SOFTIRQ和TASKIET的原理和使用方法。

 

试题四:简述一下以下Linux操作系统内核调用函数的用途。

module_init;

    —- 声明模块的初始化函数

 

register_chrdev_region;

    —- 向内核注册字符设备,应该

 

copy_from_user;

    —- 从用户空间向内核空间复制数据

 

create_proc_entry;

    —- 创建/proc文件

 

wait_event_interruptible_timeeout(queue, condition, timeout);

    —- 把当前进程放入queue指定的休眠队列,当condition满足或timeout时间到,则当前进程被唤醒,此进程的休眠状态可被中断

 

wake_up_interruptible;

    —- 唤配在休眠队列中的,可被中断的进程

 

以上A\B组试题任选一组

#####################

 

试题五:请指出以下函数存在的两个漏洞并指出其危害:

 

void str_show(const char* showstr)

{

char* echostr;

echostr=malloc(100);

if(echostr==NULL)

return;

strcpy(echostr,showstr);

printf(“just test!%s\n”,echostr);

}

(1)、未检查字符串指针参数

(2)、strcpy()函数存在越界风险

(3)、printf()存在越界风险

 

 

试题六:请描述一下FIFO、栈、二叉平衡树、堆这几种数据结构的构造与基本操作。

 

试题七:请至少列举三种排序算法并简单描述其排序过程。

 

试题八:请简要说明下列声明的意义:

int (*f) (int x, int y) func (int*p1, int x, char* (*fp) (int i));

声明一个函数func, 它接受三个参数:一个整型变量地址、一个整型变量和一个回调函数(接受一个整型参数,返回字符串指针), 返回一个函数指针(接受两个整型参数,返回整型值)。

试题九:阅读下面的程序并写出程序执行结果:

 

#include<stdio.h>

int f (int n)

{

return ++n;

}

int g (int *n)

{

return ++*n;

}

main ()

{

int n=10;

int k=0;

k=f (n)

printf (“k is: %d\n”, k);

printf (“n is: %d\n”, n);

k=g (&n);

printf (“k is: %d\n”, k++);

printf (“n is: %d\n”, n++);

}

 

请说出其运行结果: 10, 11, 11, 11

 

试题十:阅读下面的程序并写出程序执行结果:

 

#include

class Display

{

public:

virtual int ShowIt (int num) {printf (“%d\n”, num); return 0;}

int ShowIt (double num) {printf (“%1f\n”, num); return 0;}

};

class DisplayEx: public Disply

{

pulic:

int ShowIt (int num) {printf (“It is Integer, value is %d\n”, num); return 0;}

};

int main ()

{

DisplayEx dpex;

Display *p_base=&dpex;

 

p_base->ShowIt (168);

p_base->ShowIt (1.68);

dpex.ShowIt (“Hello, World\n”);

dpex.ShowIt (1.69);

dpex.Display::ShowIt (1.69);

return 0;

}

 

请说出其运行结果

 

It is Integer, value is 168

1.680000

It is string, value is Hello, World

 

It is Integer, value is 1

1.690000

 

题有错,应该为

#include <cstdio>

 

class Display{

public:

    virtual int ShowIt (int num) {

        printf (“%d\n”, num);

        return 0;

    }

int ShowIt (double num) {printf (“%1f\n”, num); return 0;}

};

 

class DisplayEx: public Display {

public:

    int ShowIt (int num) {printf (“It is Integer, value is %d\n”, num); return 0;}

    int ShowIt (char * msg) {printf (“It is string, value is %s\n”, msg); return 0;}

};

 

int main (int argc, char ** argv)

{

    DisplayEx dpex;

    Display *p_base=&dpex;

 

    p_base->ShowIt (168);

    p_base->ShowIt (1.68);

 

    dpex.ShowIt (“Hello, World\n”);

    dpex.ShowIt (1.69);

    dpex.Display::ShowIt (1.69);

    

    return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值