1.編寫程序,用size命令查看Linux可執行文件結構。
2.對程序做若干修改,查看可執行文件結構的改變,分析並給出結論
程序代碼test.c+運行結果:
實驗分析:
代碼區(test):指令常量、const聲明變量、字符串常量。
數據段(data):全局或靜態已經初始化的變量。
未初始化的數據段(bss):沒有初始化的全局變量和靜態變量。
在此次測試中,修改後的test.c文件中字符串增加了 ” world!!”,包括空格在內的八個字符,所以test段增加8個,用static定義了a=123,爲靜態已初始化變量,所以data段發生變化。
□實驗3.2.3 內存管理函數測試
1.編寫程序測試函數memcpy()和memmove()。
2.分析兩個函數的實現過程有何不同。
程序代碼+運行結果:
實驗分析:
參考網址:
http://blog.csdn.net/li_ning_/article/details/51418400
Memcpy():內存逐個字節複製
Memmove():在實現單元內存複製的時候考慮到了源空間和目的空間是否會有空間重疊的問題
memcpy對內存空間有要求的,dest和src所指向的內存空間不能重疊,否則複製的數據是錯誤的.
memmove在拷貝之前就做了一個判斷,如果dest <= src,就按照memcpy的思路拷貝,如果dest>src它是從後面往前拷貝,這樣就能正確拷貝數據了。
本次測試結果相同是因爲編譯器都優化成了可以考慮內存重疊的情況。
■實驗3.4.1進程與命令行選項及參數
1.寫一個命令行選項解析程序,支持以下功能。
短選項 長選項 參數
-a --all 可以跟參數
-d --dir 不跟參數
-h --help 不跟參數
-o --output 必須跟一個參數
代碼截圖:
函數參考了課本案例P68 getopt_long_options。
運行結果:
實驗分析:
第一次測試,輸入格式正確,全部輸出,第二次測試,-o後必須加參數但是測試沒有帶參數,沒有輸出this is output。
□實驗3.4.4Linux時間管理
1.自己設計格式,輸出日期和時間。
代碼截圖:
運行結果:
實驗分析:百度了頭文件”time.h”,和裏面的函數體time_t,Linux下存儲時間常見的有兩種存儲方式,一個是從1970年到現在經過了多少秒,一個是用一個結構來分別存儲年月日時分秒的。
time_t 這種類型就是用來存儲從1970年到現在經過了多少秒,要想更精確一點,可以用結構struct timeval,它精確到微妙。
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
而直接存儲年月日的是一個結構:
struct tm
{
int tm_sec; /*秒,正常範圍0-59, 但允許至61*/
int tm_min; /*分鐘,0-59*/
int tm_hour; /*小時, 0-23*/
int tm_mday; /*日,即一個月中的第幾天,1-31*/
int tm_mon; /*月, 從一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 從1900至今已經多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一週中的第幾天, 從星期日算起,0-6*/
int tm_yday; /*從今年1月1日到目前的天數,範圍0-365*/
int tm_isdst; /*日光節約時間的旗標*/
};
需要特別注意的是,年份是從1900年起至今多少年,而不是直接存儲如2011年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。