一、選擇題(所有同學必答題,至少有一個選項是正確的,每題4分)
1.以下哪些命令可以解壓縮.tar.bz2文件?()
A. tar -cjvf
B. tar -xjvf
C. tar -czvf
D. tar -xzvf
答:B
[cpp]
-c :建立一個壓縮文件的參數指令(create 的意思);
-x :解開一個壓縮文件的參數指令!
-t :查看 tarfile 裡面的文件!
特別注意,在參數的下達中, c/x/t 僅能存在一個!不可同時存在!
因為不可能同時壓縮與解壓縮。
-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示文件!這個常用,但不建議用在背景執行過程!
-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數!
例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法,要寫成
『 tar -zcvPf tfile sfile』才對喔!
-p :使用原文件的原來屬性(屬性不會依據使用者而變)
-P :可以使用絕對路徑來壓縮!
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的文件中
2.Unix系統中,文件存儲管理采用的是()
A. 位圖法
B. 空閒塊表法
C. 成組連接法
D. 單塊連接法
答:C
[cpp]
位圖法用的場合比較多,比如設備分配、PCB分配等,早期Linux的文件系統MINIX也使用位圖。現在的ext2、ext3都不用了。
空閒塊表法使用的場合也很多,比如內存分配等。
成組連接法用於文件系統,它將空閒塊分成若干組,每100個空閒塊為一組,每組的第一空閒塊登記了下一組空閒塊的物理盤塊號和空閒塊總數。如果一個組的第一個空閒塊號等於0,則有特殊的含義,意味著該組是最後一組,即無下一個空閒塊。分配空閒塊的時候,從前往後分配,先從第一組開始分配,第一組空閒的100塊分完了,才進入第二組。釋放空閒塊的時候正好相反,從後往前分配,先將釋放的空閒塊放到第一組,第一組滿了,在第一組前再開辟一組,之前的第一組變成第二組。
單塊連接法:不了解
3.以下硬盤分區方案中可行的是()/*P代表主分區,L代表邏輯分區*/
A. 2P + 1L
B. 3P + 2L
C. 4P + 3L
D. 5P + 4L
E. 6P + 5L
答:AB
[cpp]
各個分區的作用:
主分區用於啟動操作系統
擴展分區用於建立邏輯分區。主分區數量有限,如果需要更多的分區,就在擴展分區上增加邏輯分區。
邏輯分區用於增加分區數量。
分區的數量規定:
主分區+擴展分區 <= 4 (排除DE)
邏輯分區 <= 12,邏輯分區必須建立在擴展分區上(C排除)
4.C語言中,下列哪兩個定義是相同的?
A. const int* a = &b;
B. const* int a = &b;
C. const int* const a = &b;
D. int const* const a = &b;
答:AB CD
[cpp]
AB:如果const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位於星號的右側,const就是修飾指針本身,即指針本身是常量。
CD:指針本身和指向的內容均為常量
5.關於下面的C語言代碼片段,說法正確的是()
int test(char *src)
{
char dest[102] = {0};
strncpy(dest,src,strlen(src)-1);
return 1;
}
A. 這段代碼沒有任何安全問題
B. 這段代碼存在條件競爭漏洞
C. 這段代碼存在棧溢出漏洞
D. 這段代碼存在堆溢出漏洞
答:C
[cpp]
復制的長度是src-1,如果src-1>1024,dest就會溢出。因為dest是在棧中開辟的空間,所以是棧溢出
二、填空題(所有同學必答題,每道4分)
1.以下是linux系統中ls命令的一行輸出結果:
drwxr-xr-x 14 root root 20K 2010-08-20 23:18 Photos 共有7個字段,意義分別是文件類型及訪問權限、該目錄所包含的子目錄的個數、文件的擁有者、文件擁有者所在的組、文件所占用的空間(以字節為單位)、文件最近訪問時間、文件名
答:http://hi.baidu.com/yzzcheng/item/1a2141878447891dc31627f5
2.某二叉樹,先序遍歷的結果為BACEDFG,中序遍歷的結果為CAEBFGD,其後序遍歷的結果為CEAGFDB
答:圖略
3.代碼覆蓋測試分:語句覆蓋、判定覆蓋、條件覆蓋、路徑覆蓋
答:
[cpp]
代碼覆蓋測試,評測測試過程中已經執行的代碼的多少,與之相對的是要執行的剩余代碼的多少。具體而言代碼覆蓋率分析是這樣一個過程:(1)找出程序經過一系列測試而沒有執行的部分代碼(2)創建一個附加的測試用例來增加覆蓋率(3)決定代碼覆蓋的定量度量。
的測試覆蓋率有許多種度量方式,例如:
語句覆蓋(StatementCoverage):也稱為行覆蓋(linecoverage),段覆蓋(segmentcoverage)和基本塊覆蓋(basicblockcoverage)。它度量每一個可執行語句是否被執行到了,這個覆蓋度量的主要好處是它可以直接應用在目標代碼上,不需要對源代碼進行處理,主要缺點是對一些控制結構很遲鈍。
判定覆蓋(DecisionCoverage):也被稱為分支覆蓋(branchcoverage),所有邊界覆蓋(all-edgescoverage),基本路徑覆蓋(basispathcoverage),C2覆蓋,判定路徑覆蓋(decision-decision-path或DDPtesting)。它度量是否每個BOOL型的表達式取值true和false在控制結構中都被測試到了。這個度量有語句覆蓋的簡單性,但是沒有語句覆蓋的問題,缺點是忽略了在BOOL型表達式內部的BOOL取值。
條件覆蓋(ConditionCoverage):它獨立的度量每一個子表達式,報告每一個子表達式的結果的true或false。這個度量和判定覆蓋(decisioncoverage)相似,但是對控制流更敏感。不過,完全的條件覆蓋並不能保證完全的判定覆蓋。
路徑覆蓋(PathCoverage):也稱為斷言覆蓋(predicatecoverage),它度量了是否函數的每一個可能的分支都被執行了。路徑覆蓋的一個好處是:需要徹底的測試。但有兩個缺點:一是,路徑是以分支的指數級別增加的,例如:一個函數包含10個IF語句,就有1024個路徑要測試。如果加入一個IF語句,路徑數就達到2048;二是,許多路徑不可能與執行的數據無關。
循環覆蓋(LoopCoverage):這個度量報告你是否執行了每個循環體零次、只有一次還是多余一次(連續地)。對於do-while循環,循環覆蓋報告你是否執行了每個循環體只有一次還是多余一次(連續地)。這個度量的有價值的方面是確定是否對於while循環和for循環執行了多於一次,這個信息在其它的覆蓋率報告中是沒有的。
3.軟件開發生命周期模型有瀑布模型、快速原型模型、迭代模型。
答:
[cpp] view plaincopy
瀑布模型(Waterfall Model):該模型由於酷似瀑布聞名。在該模型中,首先確定需求,並接受客戶和SQA小組的驗證。然後擬定規格說明,同樣通過驗證後,進入計劃階段…可以看出,瀑布模型中至關重要的一點是只有當一個階段的文檔已經編制好並獲得SQA小組的認可才可以進入下一個階段。這樣,瀑布模型通過強制性的要求提供規約文檔來確保每個階段都能很好的完成任務。但是實際上往往難以辦到,因為整個的模型幾乎都是以文檔驅動的,這對於非專業的用戶來說是難以閱讀和理解的。想象一下,你去買衣服的時候,售貨員給你出示的是一本厚厚的服裝規格說明,你會有什麼樣的感觸。雖然瀑布模型有很多很好的思想可以借鑒,但是在過程能力上有天生的缺陷。
快速原型(Rapid Prototype)模型:在功能上等價於產品的一個子集。注意,這裡說的是功能上。瀑布模型的缺點就在於不夠直觀,快速原型法就解決了這個問題。一般來說,根據客戶的需要在很短的時間內解決用戶最迫切需要,完成一個可以演示的產品。這個產品只是實現部分的功能(最重要的)。它最重要的目的是為了確定用戶的真正需求。在得到用戶的需求之後,原型將被拋棄。因為原型開發的速度很快,設計方面是幾乎沒有考慮的,如果保留原型的話,在隨後的開發中會為此付出極大的代價。
迭代式模型是是RUP(統一軟件開發過程)推薦的周期模型。在RUP中,迭代包括產生產品發布(穩定、可執行的產品版本)的全部開發活動和要使用該發布必需的所有其他外圍元素。所以,在某種程度上,開發迭代是一次完整地經過所有工作流程的過程:(至少包括)需求工作流程、分析設計工作流程、實施工作流程和測試工作流程。實質上,它類似小型的瀑布式項目。RUP認為,所有的階段(需求及其它)都可以細分為迭代。每一次的迭代都會產生一個可以發布的產品,這個產品是最終產品的一個子集。迭代和瀑布的最大的差別就在於風險的暴露時間上。“任何項目都會涉及到一定的風險。如果能在生命周期中盡早確保避免了風險,那麼計劃自然會更趨精確。由於瀑布模型的特點(文檔是主體),很多的問題在最後才會暴露出來,為了解決這些問題的風險是巨大的。"在迭代式生命周期中,根據主要風險列表選擇要在迭代中開發的新的增量內容。每次迭代完成時都會生成一個經過測試的可執行文件,這樣就可以核實是否已經降低了目標風險。"
5.已經代碼段如下
[cpp]
#include <iostream>
using namespace std;
class Class1
{
char contents[0];
};
class Class2
{
};
int main()
{
cout<<sizeof(Class1)<<endl;
cout<<sizeof(Class2)<<endl;
return 0;
}
請問這段代碼的輸出結果為1 1
答:類的sizeof
三、方向性問答題(C/C++)
1.請編寫一段代碼,不使用系統提供的sizeof函數,測試當前主機上的一個int占用幾個字節。(15分)
[cpp]
int *p = new int;
cout<<p<<endl;
p++;
cout<<p<<endl;
2,網卡的MAC地址為六個字節,一般用十六進制表示,比如00-50-8D-49-57-DB,也可用冒號分割,例如00:50:8D:49:57:DB,當然也會有類似00:50:8D:49-57DB這種不規范的寫法(如果有分隔符的話,分隔符之間的字符就必然為偶數)。要求寫一個函數,把已知的一段這樣的字符串(以上三種情況都有可能出現)轉化為6個字節以‘-’分隔的標准MAC地址,並對這個函數設計單元測試用例。(25分)
答:
[cpp]
void Solve(string str)
{
int j = 0, cnt = 0;
char ch[0];
while(str[j] != '\0')
{
if((str[j] >='0' && str[j] <= '9') || (str[j] >= 'A' && str[j] <= 'F'))
{
ch[cnt] = str[j];
cnt++;
}
}
cout<<ch[0]<<ch[1]<<'-';
cout<<ch[2]<<ch[3]<<'-';
cout<<ch[4]<<ch[5]<<'-';
cout<<ch[6]<<ch[7];
}
三、方向性問答題(java)
略
三、方向性問答題(系統)
1.請簡述你對linux中proc虛擬文件系統的理解(20分)
答:
[cpp]
/proc 文件系統是一種內核和內核模塊用來向進程 (process) 發送信息的機制 (所以叫做 /proc)。 與其他文件系統不同,/proc 存在於內存之中而不是硬盤上,因此是一個偽文件系統。這個偽文件系統讓你可以和內核內部數據結構進行交互,獲取 有關進程的有用信息,在運行中 (on the fly) 改變設置 (通過改變內核參數)。如果你察看文件 /proc/mounts (和 mount 命令一樣列出所有已經加載的文件系統),你會看到其中 一行是這樣的:
grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc 由內核控制,沒有承載 /proc 的設備。因為 /proc 主要存放由內核控制 的狀態信息,所以大部分這些信息的邏輯位置位於內核控制的內存,通常是動態改變的。對 /proc 進行 一次 ‘ls -l‘ 可以看到大部分文件都是 0 字節大的;不過察看這些文件的時候,確 實可以看到一些信息。這怎麼可能?這是因為 /proc 文件系統和其他常規的文件系 統一樣把自己注冊到虛擬文件系統層 (VFS) 了。然而,直到當 VFS 調用它,請求 文件、目錄的 i-node 的時候,/proc 文件系統
才根據內核中的信息建立相應的文件 和目錄。
2.一段PHP代碼如下所示,指出存在的漏洞是什麼,如何預防。(20分)
[cpp]
<?php
$val=$_GET["reqno"];
echo $val;
?>
答:不會
三、方向性問答題(測試)
略
三、方向性問答題(前端)
略
四、綜合題(除前端開發外,所有應聘技術的同學必答題,20分)
有一枚篩子,每個面都有一個數字:1~6.很顯然,你會傾向於認為這6個面出現的概率是相等的,也就是:P(x1)=P(x2)=P(x3)=……=P(x6)=1/6。其中P(xi)表示出現數字xi的概率。假如,這枚篩子與其它篩子不同,似乎,他很容易滾到4或者5這個面上,所以這個篩子滾了足夠多次以後,它出現的平均值恆定在4.5。這個時候,你會怎樣分配P(x1)~P(x6)的概率呢?
答:不會,題目沒懂。每個面的概率是隨自己分配的?