LINUX應用開發(面試)

LINUX應用開發工程師職位html

本試卷從考試酷examcoo網站導出,文件格式爲mht,請用WORD/WPS打開,並另存爲doc/docx格式後再使用linux

說明:應用開發可考察的點很是多,關鍵的仍是C語言和數據結構,此份試卷中包括了一部分的基本C語言,數據結構和SHELL編程沒有涉及,請各位下來再精心準備C語言和數據結構,也瞭解一下shell編程(課件已經共享到考試酷班級空間裏面),多看《程序員面試寶典》和一些經典的面試題。此份試卷中的分數表示的做用是「相應知識點的重要程度」,5分題是必須掌握的,其餘的相應重要性依次下降。
1.寫一個"標準"宏MIN ,這個宏輸入兩個參數並返回較小的一個。[5分]android

參考答案:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
解析:
這個測試是爲下面的目的而設的:
1) 標識#define在宏中應用的基本知識。這是很重要的。由於在 嵌入(inline)操做符 變爲標準C的一部分以前,宏是方便產生嵌入代碼的惟一方法,對於嵌入式系統來講,爲了能達到要求的性能,嵌入代碼常常是必須的方法。
2)三重條件操做符的知識。這個操做符存在C語言中的緣由是它使得編譯器能產生比if-then-else更優化的代碼,瞭解這個用法是很重要的。
3) 懂得在宏中當心地把參數用括號括起來程序員

2.用預處理指令#define 聲明一個常數,用以代表1年中有多少秒[2分]面試

參考答案:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
解析:
) #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
2)懂得預處理器將爲你計算常數表達式的值,所以,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
3) 意識到這個表達式將使一個16位機的整型數溢出-所以要用到長整型符號L,告訴編譯器這個常數是的長整型數。
4) 若是你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要算法

3.如下3個關鍵詞,記得不要徹底照搬網上的說法,加上本身的一點本身的理解和整理shell

static有什麼用途?(請至少說明兩種)[5分]編程

參考答案:
在C語言中,關鍵字static有三個明顯的做用:
1)在函數體,一個被聲明爲靜態的變量在這一函數被調用過程當中維持其值不變。
2) 在模塊內(但在函數體外),一個被聲明爲靜態的變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3) 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。數組

4.關鍵字const有什麼含意?[5分]服務器

參考答案:
《程序員面試寶典》中是這樣說的:
1.定義const常量
2.const能夠修飾函數的參數和返回值,在C++中,還能夠修飾函數的定義體
被const修飾的東西都受到保護,能夠防止意外的改動,能提升程序的健壯性
擴展:
下面聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
/******/
前兩個的做用是同樣,a是一個常整型數
第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針能夠)
第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是能夠修改的,但指針是不可修改的)
最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)

5.關鍵字volatile有什麼含意?並給出三個不一樣的例子?[5分]

參考答案:
優化器在用到這個變量時必須每次從新從內存去讀寫這個變量的值,而不是使用保存在cache中數據。
下面是volatile變量的幾個例子:
一、中斷服務程序中修改的供其它程序檢測的變量須要加volatile;
二、多任務環境下各任務間共享的標誌應該加volatile;
三、存儲器映射的硬件寄存器一般也要加volatile說明,由於每次對它的讀寫均可能由不一樣意義;

6.解釋下面a的含義:
a) int a; 一個整型數
b) int *a; 一個指向整型數的指針
c) int **a; 一個指向指針的的指針,它指向的指針是指向一個整型數
d) int a[10]; 一個有10個整型數的數組
e) int *a[10]; 一個有10個指針的數組,該指針是指向一個整型數的
f) int (*a)[10]; 一個指向有10個整型數數組的指針
g) int (*a)(int); 一個指向函數的指針,該函數有一個整型參數並返回一個整型數
h)int (*a[10])(int); 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數 [每空1分]


7.已知:
char str[] = "farsight";
char *p = malloc( 100 );
int n = 10;
void Foo ( char var[100]){}
請計算
sizeof (str ) = 9
sizeof ( p ) = 4
sizeof ( n ) = 4
sizeof ( var ) = 4 [每空1分]


8.嵌入式系統老是要用戶對變量或寄存器進行位操做。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操做中,要保持其它位不變。[5分]

參考答案:
volatile unsigned int *a;

*a |=(1<<3);
*a &= ~(1<<3);

9.請說說進程和線程的差異?[5分]

參考答案:
進程是系統資源(好比打開的文件描述,信號等)管理的最小單位,線程是最小的執行單位.linux中用戶空間的進程,線程對LINUX內核來講,都是任務 
 線程與進程的區別: 
  (1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位 
 (2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也可併發執行  
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有獨立餓系統資源,但能夠訪問隸屬於進程的資源.  
(4)系統開銷:在建立或撤消進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或撤消線程時的開銷。


10.進程間通信有幾種方式,各有特色?[5分]

參考答案:
A:進程間通訊IPC包括6種,分別是:管道、消息隊列、共享內存、信號量、信號、SOCKET域套接字
管道: 是存在於內存中的特殊文件,不支持lseek操做,是一種半雙工通訊,有固定的讀端和寫端,它分爲無名管道和有名管道,無名管道可用於具備親緣關係的進程間通訊,有名管道則除無名管道特色外,還可用於無親緣關係的進程間通訊。
信號:一種異步通訊方式,不只可用於用戶進程/線程之間,也可用於內核與用戶進程/線程之間,信號的處理速度快於其它IPC,其編程方法是經過安裝信號處理函數(句柄)進行。
消息隊列、共享內存、信號量都是一種IPC對象,是一種資源,都是經過鍵值獲取一個資源號。消息隊列使用簡單,效率最低;共享內存是將內存中的一段內存隱射到用戶空間,使用效率最高,但其對數據的保護須要藉助信號量進行;
信號量(semaphore),也叫信號量是用於不一樣進程或一個給定進程中不一樣線程同步的手段
SOCKET域套接字:經過網絡socket編程接口實現進程間通訊。

11.線程的資源保護機制,各有什麼特色?[5分]

參考答案:
線程間資源保護機制包括3種:無名信號量、互斥鎖、條件變量。
無名信號量經常使用與對線程間一個或多個資源訪問的進行互斥或同步,和它相似的還有進程間的信號量(有名信號量),但用於線程時無名信號量的效率比較高
互斥鎖經常使用於對線程間一個資源訪問的進行互斥,防止多個線程同一時刻訪問共同的資源
條件變量 以互斥鎖爲基礎,它實現線程間同步的機制

12.LINUX應用開發中若是保證一個程序在系統中只有惟一的一個實例在運行?
提示: 參考進程課程中守護進程代碼中的文件鎖[3分]

參考答案:
最佳解決方法:採用對特定文件的一部分加上記錄鎖的方式。
void test_to_locked (){
int fd;
struct flock lock;
char *buf = "abdcefghijklmnopqrstuvwxyz";
//begin to test file lock
fd = open ("/tmp/mylock.lock", O_RDWR | O_CREAT, 0777);
if (fd < 0) {
perror ("Open file error");
exit (1);
}
write (fd, buf, strlen (buf));
fsync (fd);
//file be locked?
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10;
lock.l_type = F_WRLCK;
lock.l_pid = -1;
if (fcntl (fd, F_GETLK, &lock) < 0) {
perror ("fcntl failed!");
exit (1);
}//
if(lock.l_type == F_WRLCK)
if (lock.l_type != F_UNLCK) {
printf ("have a daemon. so quit!\n");
exit (1);
}
//locked file
lock.l_type = F_WRLCK;
if (fcntl (fd, F_SETLKW, &lock) < 0) {
printf ("Lock file failed: type = %d\n", lock.l_type);
exit (1);
}
printf ("xxx program have runned\n");}

13.(擴展)描述實時系統的基本特性?常見的實時系統有哪些?LINUX是不是實時系統?如何提升LINUX系統和應用的實時性?[4分]

參考答案:
實時系統(Real Time Operating System)的定義:
實時系統是指規定的時限內必須完成規定的操做作出相應響應的系統。系統行爲的具備可預測性,意思是實時操做系統面對變化的負載(從最小到最壞的狀況)時必須肯定性地保證知足時間要求。請注意,它是指必需要知足時間響應的肯定性,而不是指速度的快慢!
實時系統根據實時不知足時候帶來的後果不一樣,分爲:
硬實時:超過期限完成任務會致使災難性後果
軟實時:超過期限完成對任務會帶來系統性能的嚴重降低
評價一個操做系統實時性好壞的三大性能指標是:搶佔延遲、中斷延遲、調度延遲
常見的硬實時系統有Vxworks, ucos-II/III, FreeRTOS,Wince(4.0以上版本),threadX等.標準的LINUX不是實時系統。
LINUX系統級的實時性提升主要有2種方式:
增長一層硬實時系統,把標準LINUX內核做爲一個最低優先級任務去運行,這種方式有RT-Linux, Xenomai,RTAI,系統層次以下:


   
另一種方式是: 經過修改標準的內核,增長實時性,這種方式主要有社區的Ingo Molnar的patch(http://www.kernel.org/pub/linux/kernel/projects/rt/)和 TimeSys的內核修改,層次以下:


   
無論採用哪一種實時LINUX,都須要很是慎重和要通過嚴格的測試才能部署

應用方面: 若是標準的LINUX,能夠經過nice命令或者nice()函數,加大相應任務的時間片提升任務所謂的「實時性」(注,這個並不是真正的實時性,而是增長特定時間段裏面重要任務運行的時間而非指實時任務就緒後當即去搶非實時任務的CPU的概念),若是使用系統級改進的實時系統,則採用相應的API調用去提升實時任務的實時性:
硬實時編程實例:(如下不用掌握)
   

軟實時編程實例:
更多的參考:https://rt.wiki.kernel.org 和實時性講座視頻http://v.youku.com/v_show/id_XMTAyODU1OTc2.html

 

14.(擴展)解釋一下嵌入式系統中的優先級翻轉,什麼狀況下優先級會出現翻轉,以及如何避免優先級翻轉?[4分]

參考答案:
優先級翻轉 (百度詞條 http://baike.baidu.com/view/2422471.htm 解釋的很是到位,摘錄以下)更詳細請查看:參考視頻 http://v.youku.com/v_show/id_XMTAyODU1OTc2.html 第27分30秒左右的視頻段 

 所謂優先級翻轉問題(priority inversion)即當一個高優先級任務經過信號量機制訪問共享資源時,該信號量已被一低優先級任務佔有,而這個低優先級任務在訪問共享資源時可能又被其它一些中等優先級任務搶先,所以形成高優先級任務被許多具備較低優先級任務阻塞,實時性難以獲得保證。
  例如:有優先級爲A、B和C三個任務,優先級A>B>C,任務A,B處於掛起狀態,等待某一事件發生,任務C正在運行,此時任務C開始使用某一共享資源S。在使用中,任務A等待事件到來,任務A轉爲就緒態,由於它比任務C優先級高,因此當即執行。當任務A要使用共享資源S時,因爲其正在被任務C使用,所以任務A被掛起,任務C開始運行。若是此時任務B等待事件到來,則任務B轉爲就緒態。因爲任務B優先級比任務C高,所以任務B開始運行,直到其運行完畢,任務C纔開始運行。直到任務C釋放共享資源S後,任務A才得以執行。在這種狀況下,優先級發生了翻轉,任務B先於任務A運行。  
  解決優先級翻轉問題有優先級天花板(priority ceiling)和優先級繼承(priority inheritance)兩種辦法。  
  優先級天花板是當任務申請某資源時, 把該任務的優先級提高到可訪問這個資源的全部任務中的最高優先級, 這個優先級稱爲該資源的優先級天花板。這種方法簡單易行, 沒必要進行復雜的判斷, 無論任務是否阻塞了高優先級任務的運行, 只要任務訪問共享資源都會提高任務的優先級。
 優先級繼承是當任務A 申請共享資源S 時, 若是S正在被任務C 使用,經過比較任務C 與自身的優先級,如發現任務C 的優先級小於自身的優先級, 則將任務C的優先級提高到自身的優先級, 任務C 釋放資源S 後,再恢復任務C 的原優先級。這種方法只在佔有資源的低優先級任務阻塞了高優先級任務時才動態的改變任務的優先級,若是過程較複雜, 則須要進行判斷。

15.TCP/IP的分層和OSI模型的分層?[5分]

參考答案:
 
   
擴展:補充知識須要去看和理解一下,關於二層交換機,三層交換機,路由器的知識請參考:
http://network.51cto.com/art/201204/327555_1.htm 和 http://baike.baidu.com/view/116622.htm 

16.TCP/IP 創建鏈接的3次握手過程和關閉連接的4次握手?[5分]

參考答案:
 參看繪圖的左邊部分,關鍵點:


1. 要標註 客戶端(client)和服務器(server)
2.三次握手必定是由客戶端發起
3.SYN, ACK/ FIN,ACK必定要標示
    

17.創建socket的API函數(或者叫步驟)?[5分]

參考答案:
 參看繪圖部分,


關鍵點:
1. 要標註 客戶端(client)和服務器(server)
2.鏈接必定是先由客戶端發起
3.客戶端、服務器之間的鏈接必定是在connect()和accept()之間進行
4.服務器端accpet()返回的是新的套接字描述符,客戶端必定是和新套接字進行通訊
5.面試如遇到,最好把函數的API裏面參數補全  

18.ARP/RARP協議是什麼?ICMP是什麼協議,他們各處於哪一層?
提示: 最好去查一下各是什麼做用[5分]

參考答案:
參考以下手繪中的相關部分:1.ARP/RARP:地址解析/逆向地址解析, arp是IP地址解析爲MAC地址 RARP MAC地址解析爲IP地址,在TCP/IP協議族裏面它處於網絡層它們處於網絡接口與物理層
2.ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息,在TCP/IP協議族裏面它處於網絡層
   

19.廣播和多播的區別? [2分]

參考答案:
參考: http://net.chinaunix.net/5/2008/11/13/1311505.shtml 本身再總結一下

20.列舉你所知道的儘量多的TCP/IP中應用層協議
提示: HTTP,FTP,TELNET這些都是[3分]

參考答案:
   
嵌入式相關協議:
網頁: http,
文件傳輸: ftp
遠程登陸:telnet ssh
郵件收發:pop3/imap, smtp
NTP: 網絡時鐘,用於低成本產品,節省
SNMP 簡答網絡管理協議,常常用於網絡設備的集中管理,網上招聘和職位有專門的SNMP工程師
RTP/RTSP:經常使用於視頻監控,網絡播放音視頻的設備
   

21.(擴展)RTP/RTSP協議的做用和基本原理?
注: 視頻監控中常常須要要到這個協議,最近視頻監控企業網上招聘比較多,請準備[5分]

參考答案:
RTP/RTSP協議是實時網絡傳輸協議, 它能夠根據網絡狀態調整畫面質量,並可實現暫停、快進、快退等實時交互動做。

整個RTSP協議棧是在TCP/IP協議棧之上創建的,
RTP協議服務媒體數據的傳輸;
RTCP負責檢查網絡情況,如網絡流量監測、網絡阻塞監測;
RTSP提供控制功能,如播放、暫停、前進、後退等功能。
RTP/RTSP協議的分層和工做模式以下:
    
    
RTSP協議的沒有統一的API,該協議的實現有 FFmpeg、Live555等開源項目

具體介紹參考: http://blog.c114.net/html/40/26740-55502.html

22.(擴展)如何解決網絡通訊中出現網絡異常(或叫超時)的問題?能夠採起哪些措施提升網絡的性能?[5分]

參考答案:
能夠採用2個方式:
內核中:網卡驅動中 2.6內核裏面,使能1s的週期性檢查定時器 網卡硬件或者咱們經過GPIO,插拔網線時候產生中斷,處理相應中斷 這樣就能當即檢測到
應用層: 採用心跳檢測 客服端服務器建立相應的鏈路,而後根據業務邏輯每隔必定的時間,相互通訊,以驗證雙方的網絡是否處於保活狀態

23.(擴展)網絡爲何會發生擁塞,發生擁塞的時候網絡如何處理?[4分]

參考答案:
參考下圖中偏右邊的手繪圖


真正過程參考:http://blog.csdn.net/machh/article/details/6731780
     

24.描述內存分配方式以及它們的區別?
提示:從局部變量,靜態,全局變量,malloc()所處的內存位置去考慮[4分]

參考答案:
1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。
2) 在棧上建立。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集。
3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員本身負責在什麼時候用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用很是靈活,但問題也最多。

25.請畫出linux程序運行時的內存映射並加以說明
提示: LINUX程序是經過ELF格式進行運行的[4分]

參考答案:

看下面圖裏面的exec()的過程 

 

26.(擴展)下面是一個16×16的黑白圖片:
static unsigned short stopwatch[] = {
0x07c6,
0x1ff7,
0x383b,
0x600c,
0x600c,
0xc006,
0xc006,
0xdf06,
0xc106,
0xc106,
0x610c,
0x610c,
0x3838,
0x1ff0,
0x07c0,
0x0000,
};
如何修改聲明,可使之在源代碼中形象地表現出圖形的模樣?[2分]

參考答案:
上述圖標其實是高度是16點,寬是2個字節,實際上,字符庫裏面16×16的點陣字符和此相似。 把一個字節裏面的全部值用二進制表示爲0x0~0xff,再把字節中的每一位1用"x"表示,0用"_"表示,好比:#define ________ 0x0
#define _______X 0x1
#define ______X_ 0x2
#define ______XX 0x3
#define _____X__ 0x4
//...
#define XXXXXXX_ 0xfe
#define XXXXXXXX 0xff
好比ASCII字符"6"就能夠表示爲:
const unsigned char acFont16B_ASCII_0036[16] = { /* code 0036 */
________,
________,
________,
__XXX___,
_X__XX__,
XX______,
XX______,
XXXXX___,
XX__XX__,
XX__XX__,
XX__XX__,
XX__XX__,
_XXXX___,
________,
________,
________
};
又好比ASCII字符"E"就能夠表示爲:
const unsigned char acFont16B_ASCII_0045[ 16] = { /* code 0045 */
________,
________,
________,
_XXXXXX_,
_XX_____,
_XX_____,
_XX_____,
_XXXXXX_,
_XX_____,
_XX_____,
_XX_____,
_XX_____,
_XXXXXX_,
________,
________,
________
};
再好比漢字「財」:
const unsigned char acFontF16x16_HKS_8CA1[ 32] = { /* code 8CA1 */
________,___X____,
_XXXXX__,___X____,
_X___X__,___X____,
_XXXXX__,___X____,
_X___X_X,XXXXXXX_,
_X___X__,__XX____,
_XXXXX__,__XX____,
_X___X__,_X_X____,
_X___X__,_X_X____,
_XXXXX__,X__X____,
_______X,___X____,
__X_X_X_,___X____,
__X__X__,___X____,
_X___XX_,___X____,
X____X__,_X_X____,
________,__X_____
};

27.2個快速判斷你的LINUX水平的問題:
1.你常常看什麼技術類書籍?列舉一下你常常去的技術類網站?
2.你寫過多少行C語言代碼? 你實現過的數據結構算法?
[4分]

參考答案:
列幾本比較經典的:
LINUX的應用開發:
《unix高級環境編程》
《TCP/IP詳解》
底層驅動參考書:
Jonathan Corbet等 《Linux device drivers》 3rd
Robert Love 《linux kernel development》 3rd
宋寶華 《linux驅動開發詳解》 2nd
技術類網站:
www.kernel.org 內核源代碼的網站
lwn.net 可免費看一週前全部技術類專題和週刊,強烈推薦
http://free-electrons.com/ 不少的linux,android免費的培訓講義

C語言代碼方面,通常C徹底掌握的代碼量是寫過1~2萬行,請根據本身的實際狀況和結合企業需求回答

數據結構:通常關鍵包括線性表,棧和隊列,串,多維數組,二叉樹等
冒泡,二分查找,拆半查找等

============ 本試卷共計27題,此處爲結束標誌。考試酷examcoo ============

相關文章
相關標籤/搜索