linux系統程式設計面試題

2022-08-25 17:33:31 字數 1646 閱讀 1362

說明:所有題目均摘錄於網路以及我所見過的面試題目,歡迎補充!

無特殊說明情況下,下面所有題s目都是linux下的32位c程式。

1、堆和棧有什麼區別?

(1)棧由作業系統分配和釋放;堆則是程式設計師手動去申請釋放;

(2)棧是一塊連續的記憶體區域,也就是棧頂位址和棧的最大容量是系統規定的;堆是不連續的記憶體區域,是因為系統使用鍊錶來儲存空閒記憶體位址。

(3)對於棧,在函式呼叫時,第乙個入棧的是函式呼叫語句的下一條可執行語句的位址,然後是函式引數(一般是從右到左)入棧,最後是區域性變數(靜態變數不入棧)。函式呼叫結束後,區域性變數先出棧,然後是引數。對於堆,一般在堆頭部用乙個位元組存放堆大小,其他內容由程式設計師安排。

2、棧可能是向上生長,也可能是向下生長,試寫一段**,判斷棧生長方向?

解析:我們可以根據區域性變數入棧的特性來判斷,由棧的連續性還有區域性變數入棧的方式,我們可以來判斷棧的生長方向。

bool

stackdownward()

else }

3、定義乙個巨集,來求結構體中某成員的偏移量

#define offsetof(type, member)  ((size_t) &((type *)0)->member )
解析:將0轉換為(type *)型別,也就是結構體首位址為0,因此資料成員的偏移量也就是相對於0的偏移量,直接取該成員位址就是所求的偏移量。

4、判斷大小端

可用兩種方法,如下:

bool isbigendian()  

return

false;

}

聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性可以輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫:

bool isbigendian()  

num;

num.a = 0x1234

;

if( num.b == 0x12

)

return

false;

}

關於大小端的概念:

1) little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。

2) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。

舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:

1)大端模式:

低位址 -----------------> 高位址

0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低位址 ------------------> 高位址

0x78  |  0x56  |  0x34  |  0x12

可見,大端模式和字串的儲存模式類似。

參考:

1、《詳解大端模式和小端模式》

Linux 系統程式設計

1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...

Linux系統程式設計

1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...

程式設計面試題

1.自定義乙個分頁函式,傳參當前頁數 總頁數,輸出以下 1.34567.10 123456.10 1 showpage是掐頭去尾的顯示數量 2 這個函式的重點就在於起始值和結束值的運算 3function page currentpage,totalpages,showpage 5 412 13 p...