1. 程式人生 > >嵌入式或LINUX相關研發面試題目(轉)

嵌入式或LINUX相關研發面試題目(轉)

基礎試題(C語言)

一、ANSI C/C++方面的知識
一.1、簡答題。下面的題目必須全部答對才給分(20分):
1、 如何在C中初始化一個字元陣列。
2、 如何在C中為一個數組分配空間。
3、 如何初始化一個指標陣列。
4、 如何定義一個有10個元素的整數型指標陣列。
5、 s[10]的另外一種表達方式是什麼。
6、 GCC3.2.2版本中支援哪幾種程式語言。
7、 要使用CHAR_BIT需要包含哪個標頭檔案。
8、 對(-1.2345)取整是多少?
9、 如何讓區域性變數具有全域性生命期。
10、C中的常量字串應在何時定義?
11、如何在兩個.c檔案中引用對方的變數。
12、使用malloc之前需要做什麼準備工作。
13、realloc函式在使用上要注意什麼問題。
14、strtok函式在使用上要注意什麼問題。
15、gets函式在使用上要注意什麼問題。
16、C語言的詞法分析在長度規則方面採用的是什麼策略?
17、a+++++b所表示的是什麼意思?有什麼問題?
18、如何定義Bool變數的TRUE和FALSE的值。
19、C語言的const的含義是什麼。在定義常量時,為什麼推薦使用const,而不是#defin

e。
20、C語言的volatile的含義是什麼。使用時會對編譯器有什麼暗示。

一.2、問答題。
1、-----------------------------------------------------------

"匈牙利命名法"有什麼優缺點?(2分)

2、-----------------------------------------------------------

下面x, y, *p的值是多少,有什麼問題?(2分)
int x, y, z = 2;
int *p=&z;
x=sizeof*p;
y=x/*p; /* x=?, *p=?, y=?, 有什麼問題?*/

3、-----------------------------------------------------------

下面的語句是什麼意思?如何宣告或定義才使它們更易懂?(10分)
int (*foo())();
int (*foo())[];
int (*foo[])();
(*(void(*)())0)();
void (*signal(int,void(*)(int)))(int);

4、-----------------------------------------------------------

本題(2分)。一般使用malloc時,需要進行強制型別轉換,如:
char *s; s = (char *)malloc(31);
下面中???該如何填寫,才可以正確執行強制型別轉換?
int (*monthp)[31]; monthp = (???)malloc(31);

5、-----------------------------------------------------------

關於C語言運算子優先順序的記憶技巧是什麼?(2分)
/* 下面r的值是多少 */
int hi, low, r;
hi=7;low=3;
r=hi<<4+low;

6、-----------------------------------------------------------

指標和陣列的區別是什麼?用一個簡單的宣告把它們區分開。(2分)
指標和陣列的宣告在什麼情況下是相同的?(2分)

7、-----------------------------------------------------------

C語言的左值(lvalue)和右值(rvalue)的含義是什麼?(2分)

8、-----------------------------------------------------------

為什麼C語言可以實現printf(char *format, ...)這樣可變引數的呼叫形式?這樣有什

麼缺點?(2分)

9、-----------------------------------------------------------

說明C語言中術語"宣告""定義""原型"的含義?(2分)

10、-----------------------------------------------------------

舉一個例子,說明使用assert和防錯程式碼的區別。(5分)

11、-----------------------------------------------------------

對語句 if else 與操作符 ? : 使用場合的比較。(2分)

12、-----------------------------------------------------------

編寫一個函式,輸入一個的整型數字,可以選擇按照8/10/16進位制輸出字串。
注意邊界值。(5分)

13、-----------------------------------------------------------

本題(2分)。下面是一個16x16的黑白圖示:
static unsigned short stopwatch[] = {
0x07c6,
0x1ff7,
0x383b,
0x600c,
0x600c,
0xc006,
0xc006,
0xdf06,
0xc106,
0xc106,
0x610c,
0x610c,
0x3838,
0x1ff0,
0x07c0,
0x0000,
};
如何修改宣告,可以使之在原始碼中形象地表現出圖形的模樣。

14、-----------------------------------------------------------
說出可以使用calendar[11][30]變數的四種類型定義。(5分)
如:int calendar[12][31]; /* 二維陣列 */

15、-----------------------------------------------------------
使用strcmp,當字串相同時會返回'\0'。但'\0'一般作為邏輯假,
因此下面的語句不容易理解:
if (!strcmp(s, "string")) return EQUATION;
如何經過簡單修改,使之更易懂?(2分)

16、-----------------------------------------------------------
編寫一個自己的完全C語言版本的memset函式,並且評價這個實現的效能和可移植性。(5

分)

17、-----------------------------------------------------------
在樹和圖這些資料結構中,通常使用指標來組織資料。如果我們要把這些資料儲存到文


中,指標是沒有意義的。我們該如何解決這個問題。(2分)

18、-----------------------------------------------------------
用2種不同的方法計算long變數的"1"bit的個數。(2分)

19、-----------------------------------------------------------
任意給出一個C的基本資料型別,如何編碼判斷這個資料型別是有符號還是無符號的?(2

分)
不得上機實驗,寫出下面程式碼的輸出。解釋這個行為是標準定義的,還是依賴實現的。(

2分)
int i;
for (i = 0; i < 10; i++) {
int j = i;
printf ("%d\n", j);
}

20、-----------------------------------------------------------
列出5種以上你所看過的C程式設計的書籍,並寫簡要書評。(5分)
對C的評價。如果要你改造一把菜刀,使之更加安全,你是否會使用這樣的菜刀,為什麼

?(5分)

一.3、分析題。
本題(各5分)。假設下面程式碼中的變數都是合法變數,呼叫外部的函式都是正確的。回答

幾個問題:
這些程式碼意圖要幹什麼?
是否有問題?
如果有問題,該如何修改,或者如何避免類似錯誤發生?
如果沒有問題,如果程式碼有輸出,輸出是什麼?
1、-----------------------------------------------------------

int isvowel (char c)
{
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}

2、-----------------------------------------------------------

while (c=='\t'||c=' '||c=='\n')
c=getc(f);

3、-----------------------------------------------------------

/* 當x=2, y=3, z=? */
if (x==0)
if (y==0)
z=-1;
else
z=x+y;

4、-----------------------------------------------------------

/* 處理網路事件 */
void process_network_code(int x, int y)
{
/* 選擇modes_pointer資源 */
switch (line) {
case THING1:
/* 處理異常1#, 使用老的modes_pointer資源 */
doit1();
break;
case THING2:
/* 處理異常2#, 需要重新啟動服務 */
if (x == STUFF) {
/* 重新申請modes_pointer資源,沒有初始化 */
do_first_stuff();
/* 在這種條件下,有些資源不用重新申請 */
if (y == OTHER_STUFF)
break;
/* 申請剩下的資源,並初始化 */
do_later_stuff();
}
/* 初始化modes_pointer資源 */
initialize_modes_pointer();
break;
default:
/* 處理普通事件, 使用老的modes_pointer資源 */
processing();
}
/* 使用modes_pointer資源,處理事件 */
use_modes_pointer();
}

5、-----------------------------------------------------------

int is_gb2312_char(char c1, char c2)
{
if (c1 >= 0xa1 && c2 >= 0xa1)
return 1;
else
return 0;
}

6、-----------------------------------------------------------

下面x, y的值是多少,有什麼問題?
int x = 10, y = 3;
x ^= y;
y ^= x;
x ^= y;
/* x=?, y = ? */

7、-----------------------------------------------------------

int days[]={31,28,31,30,31,30,31,31,30,31,30,31,};
int calendar[12][31];
int (*monthp)[31];
int *dayp;
int i;

memset(calendar, 0, sizeof(calendar));
i = 0;
for (monthp = calendar; monthp < &calendar[12]; monthp++) {
for (dayp = *monthp; dayp < &(*monthp)[31]; dayp++) {
if (dayp - *monthp < days[calendar - monthp]) {
*dayp = i++ % 7 + 1;
}
}
}

8、-----------------------------------------------------------

void printnum(long n)
{
if (n < 0) {
putchar('-');
n = -n;
}

if (n >= 10) {
printnum(n/10);
}

putchar ("0123456789"[n%10]);
}

9、-----------------------------------------------------------

void * memchr(void *pv, unsigned char ch, size_t size)
{
unsigned char *pch = (unsigned char *) pv;
unsigned char *pchEnd = pch + size;

while (pch < pchEnd) {
if (*pch == ch)
return (pch);
pch++;
}

return NULL;
}

10、-----------------------------------------------------------

void * memchr(void *pv, unsigned char ch, size_t size)
{
unsigned char *pch = (unsigned char *) pv;
unsigned char *pchPlant = pch + size;
unsigned char chSave = *pchPlant;

*pchPlant = ch;
while (pch != ch) {
pch++;
}
*pchPlant = chSave;

return ((pch == pchPlant) ? NULL : pch);
}

11、-----------------------------------------------------------

void UnsToStr(unsigned short int u, char *str)
{
char *pch;

assert(u <= 65535);
pch = &str[5];
*pch = '\0';
do {
*--pch = u % 10 + '0';
} while ((u / 10) > 0);

strcpy(str, pch);
}

12、-----------------------------------------------------------

void *memmove(void *pvTo, void pvFrom, size_t size)
{
char *pbTo = (char *)pvTo;
char *pbFrom = (char *)pvFrom;

((pbTo < pbFrom) ? tailmove : headmove) (pbTo, pbFrom, size);
return (pvTo);
}

13、-----------------------------------------------------------

void *memcpy(void *pvTo, void pvFrom, size_t size)
{
char *pbTo = (char *)pvTo;
char *pbFrom = (char *)pvFrom;

while (size-- > 0);
*pbTo++ = *pbFrom++;
return (pvTo);
}

14、-----------------------------------------------------------

#include <stdio.h>

int main(int argc, char *argv[])
{
char s[]="0123456789";
int i = 0;

do {
printf ("%c", i++[s]);
} while(s?1:printf("\n")-1);

return 0;
}

15、-----------------------------------------------------------

int fibonacci(int x)
{
if (x == 1 || x == 2)
return 1;
return fibonacci(x - 2) + fibonacci(x - 1);
}

16、-----------------------------------------------------------

這裡有一個程式cdecl.c。寫出它的工作流程。寫出它的使用方法。
給出一個典型輸入用例,記錄下它的輸出。

一.4、綜合程式設計題。
要求:
1、完成需求,程式執行正確。
2、工作原理文件,使用文件完整。
3、程式碼規整優美。註釋得當。
4、執行速度足夠快。
5、用工具分析出是哪些程式碼或函式造成速度瓶頸。

1、-----------------------------------------------------------
編寫一個排序程式。被排序的檔案有8MB大小,一行一個隨機整數(ASCII格式)。要求對

這些整數進行
排序,並計算平均值,打印出排序所需的時間。(20分)

2、-----------------------------------------------------------
用dummy header技巧實現一個連結串列DEMO。要求具有create, insert, delete, search功

能。
編寫一個應用程式,使用上面的函式。使用dummy header技巧有什麼優點。(20分)

3、-----------------------------------------------------------
用heapsort演算法實現優先佇列。要求具有create, insert, delete功能。
編寫一個應用程式,使用上面的函式。使用heapsort演算法有什麼優點。(20分)

用trie(一種多叉樹)實現一個字典。要求具有create, insert, delete, search功能。

編寫一個應用程式,使用上面的函式。使用trie樹有什麼優點。(20分)

二、POSIX方面的知識。
二.1、簡答題。下面的題目必須全部答對才給分:(5分)
1、在UNIX環境中,編譯流程是什麼?
2、ABI,ELF的英文全稱是什麼
3、一般UNIX的程式有多少段,舉一個實際的例子說明。
4、如何在kernel二進位制程式碼中找一個字串。
5、段地址F000:FFF0轉換為線形地址的值是多少(16進製表達)。
6、在一個UNIX檔案系統中,檔案的唯一性標誌是什麼?

二.2、問答題。
1、-----------------------------------------------------------
寫一些程式碼。如何用檔案實現訊號燈?要求如果程式崩潰了,這個檔案也將自動被刪除


為什麼可以這樣實現訊號燈?(5分)
傳統的signal函式訊號處理為什麼是不可靠的,訊號和系統呼叫有何關係?(5分)
在圖形庫系統中往往提供timer的功能,除了使用ALARM訊號外,你還可以使用什麼系統

呼叫來實現timer?(5分)
2、-----------------------------------------------------------
寫一些程式碼,演示如何正確使用write系統呼叫。注意看好手冊再回答。(2分)
如果一個檔案以rw模式開啟,在進行read/write操作轉換時,需要進行什麼操作。(2分)


3、-----------------------------------------------------------
解釋終端結構termios.c_cc的MIN/TIME數值變化的帶來read/write的特性。(5分)
如何理解終端、控制終端、虛擬終端、控制檯、tty等類同的概念?(5分)
4、-----------------------------------------------------------

解釋計算機中Copy-On-Write的概念。(2分)

呼叫fork之後,子程序沒有繼承父程序的屬性有哪些?(5分)
解釋為什麼每個程式在裝入執行之後,總是已經預先打開了stdout、stdin、stderr?(2

分)
在fork之前,父程序打開了一個檔案。在fork之後,如果子程序移動了檔案指標,
父程序的檔案指標有什麼變化;如果子程序關閉了檔案,父程序有什麼變化?為什麼會

這樣?(5分)
標準輸入、輸出和錯誤輸出分別是什麼型別的緩衝,這些緩衝在使用者空間還是在核心空

間?
怎樣關閉他們的緩衝?如果父程序關閉了緩衝,在fork之後建立的子程序是否也關閉了

緩衝?(5分)
vfork和fork相比,有什麼特色?(2分)
system函式是否等同於fork+exec?(2分)

wait系統呼叫有多少種條件可以退出?(2分)

5、-----------------------------------------------------------
系統呼叫和庫函式呼叫有什麼區別。(2分)
在linux2.4.x上的glibc和newlib(一種嵌入式C庫)的系統呼叫有什麼不同?(2分)
在linux2.4.x上,對系統呼叫execve如果呼叫成功,它返回的值是多少。(2分)

6、-----------------------------------------------------------
列出你所知道的2個記憶體跟蹤庫。(2分)
設計一個記憶體跟蹤方案,為什麼選擇這個方案(5分)

二.3、綜合程式設計題。
要求:
1、完成需求,程式執行正確。
2、工作原理文件,使用文件完整。
3、程式碼規整優美。註釋得當。
4、執行速度足夠快。

1、-----------------------------------------------------------
這裡有一個8MB的檔案,編寫一個copy程式,拷貝這個檔案,並計算所需時間。用工具分


出是哪些程式碼或函式造成速度瓶頸。
提示:如果只是使用read/write呼叫,不是一個好的實現。(20分)

2、-----------------------------------------------------------
Linux系統中,什麼時候會出現類似Y2K的問題。寫一個程式證明。(20分)

3、-----------------------------------------------------------
編寫一個程式,測試系統最小的睡眠時間間隔。(20分)

4、-----------------------------------------------------------
編寫一個pipe程式,測試有N個管道,size大小的buffer情況下,pipe的傳輸效能是多少

?(20分)

5、-----------------------------------------------------------
在ext2檔案系統上,單個檔案最大可以達到多少?
寫一個程式獲得這方面的限制。(20分)

三、Linux程式設計基本使用知識。
三.1、命令和shell
1)編寫一個指令碼,統計一個目錄下面所有C程式碼的行數。(2分)
2)編寫一個sed指令碼,去除HTML檔案中的HTML標記。(2分)
3)編寫一個指令碼獲得當前系統eth0的IP地址。(2分)
4)編寫一個指令碼以互動的方式,進行DNS的設定。(2分)
5)使用ls命令編寫一個指令碼,實現ls -R,遞迴列出當前目錄下的所有目錄、檔案。(2

分)
6)-----------------------------------------------------------
在一個目錄下,找soft-link files,用下面的命令,原理是可行的,但無法操作,
該如何解決?要2種方法。(2分)
ls -l | grep ->

7)-----------------------------------------------------------
如何把標準錯誤輸出,重定向到標準輸出上。(2分)

8)-----------------------------------------------------------
我們的系統中的軟體包是使用RPM管理的。要求下面的問題寫出shell命令和執行結果。(

5分)
如何知道系統中安裝了幾個軟體包。
如何知道系統中安裝了哪幾類(group)軟體包。
如何知道kernel軟體包的簡述。
如何知道kernel軟體包的Changelog。
如何知道kernel軟體包有幾個檔案。
如何知道kernel軟體包安裝後有多大。

三.2、編輯工具的使用。(各2分)
1)如何使用vi進行塊拷貝、貼上、刪除的操作
2)如何設定Tab的長度,以及自動縮排的長度
3)如何使用tag進行程式碼閱讀
4)如何在1~10行,有確認的進把所有的RedHat改為RedFlag
5)在SourceNavigator中,如何跳到一個變數的宣告處?如何得知游標當前的位置在那

個函式體內?

三.3、編譯器與偵錯程式。(各2分)
1)如何使用gcc得到巨集展開的中間程式碼
2)如何通過gcc在命令列中傳入巨集定義
3)在那一級優化的情況下,行內函數才真正的內聯到程式碼中
4)gdb的watch命令如何使用,有何缺點
5)gdb中使用什麼命令可以顯式呼叫的棧幀,如何檢視某個棧幀上的區域性變數
6)如何使用gdb除錯多程序
7)如何使能/禁止core dump?

三.4、庫。(各2分)
1)如何知道XSetIMValues這個符號在那個X的庫檔案中
2)如何讀取C++的符號名,更具可讀性
3)請解釋動態庫的soname概念
4)解釋在連結時rpath選項的含義

三.5、Makefile。(10分)
如果有一個簡單的Test專案目錄如下:
# tree Test
Test
|-- common.h
|-- main.cpp
|-- test.cpp
`-- test.h

1)使用wildcard、patsubst函式編寫一個C++專案的Makefile檔案
2)使用automake、autoconfig編寫一個支援configure選項的configure.in指令碼

三.6、CVS。(10分)
1)如果一個CVS專案中,甲添加了一個子目錄模組,那麼乙在update時是否會自動檢
出這個新新增的子模組?如果不能,那麼你有什麼好的解決方案?
2)如何在一個CVS專案中新增一個二進位制檔案,這個二進位制檔案可以進行增量的版本管

理嗎?
3)如何檢出標記(tag)為milestone-1的版本,如何建立以milestone-1為基礎的分支

milestone-1-b1,並如何把分支的修改合併到milestone-1的主分支上

三.7、Linux/GNU程式設計基本知識
1、-----------------------------------------------------------
Linux2.4.x有多少種類型的裝置檔案?分別寫出來。(2分)

2、-----------------------------------------------------------
glibc動態庫的搜尋次序是什麼?(2分)
glibc 2.1.x 與 2.2.x的動態庫的搜尋次序有什麼不同?為什麼會採用現在的方案?(2

分)


三.3、綜合程式設計題。
要求:
1、完成需求,程式執行正確。
2、工作原理文件,使用文件完整。
3、程式碼規整優美。註釋得當。
4、執行速度足夠快。

1、-----------------------------------------------------------
本題(20分)。寫一個程式,有三個功能:
a)取得CMOS中的當前時間,按照YY:MMD:HH:MM:SS格式輸出。
b)取得實體記憶體的大小,格式化輸出。
c)取得從物理段地址F000:FFF0起,16個位元組的值,每位元組按照16進位制格式輸出。

2、-----------------------------------------------------------
本題(20分)。對串列埠程式設計,編寫一對類似ping的程式,作用在串列埠上,瞭解serial的聯

通情況。
定義協議
要求:
定義一個聯通和響應協議。至少具有:傳送、回覆、超時三種狀態。除超時狀態外,所


狀態的資料必須經過校驗才可使用。

ping_serial_client
要求:
1,傳送資料包;
2,等待回覆資料包,直到超時;
3,如果有回覆資料包,對資料包進行校驗;
4,計算校驗通過的資料包之間的時間差;
5,重複直到使用者退出;
6,統計丟包率,時間。
介面:
bash# ping_serial_client /dev/ttyS0 baud_value
??bytes from ttyS0, time=??ms
......
^C
--- ttyS0 ping statistics ---
?? packets transmitted, ?? received, ??% loss
time ??ms, min/avg/max = ??/??/?? ms

ping_serial_server
要求:
1,等待對方的傳送資料包;
2,對傳送資料包進行校驗;
3,校驗通過則回覆資料包;
4,重複直到使用者退出;

介面:
bash# ping_serial_server /dev/ttyS0 baud_value

3、-----------------------------------------------------------
編寫一對socket程式,要求類似於network echo procotol。
Client每隔1秒把自己的IP地址輪流迴圈傳送給一個Server.
Server接到IP後,在螢幕上列印對方IP;然後把自己的IP傳送回去。
Client收到回覆後,在螢幕上列印對方IP。
程式一直執行,直到使用者退出。各自分類統計接收到的各IP的資料包的個數。
注意:Client可以向多個Server傳送請求,Server也可以接收多個Client請求。
注意:輸出資訊的美觀,和對錯誤的處理。
-----------------------------------------------------------

四、C++題目。

-----------------------------------------------------------

1。給定下面的程式碼:

class Graph{
public:
Graph() { s_gCount++; }

virtual ~Graph() { s_gCount--;}

virtual int drawOut() = 0;

static int getTotalCount() { return s_gCount; }

protected:
int m_x;
int m_y;
static int s_gCount;
};