□□實驗5.2.5 文件定位用lseek()函數實現以下功能
1.獲取文件大小
2.爲文件添加指定長度的空洞
3.在指定位置寫入指定內容
4.讀出指定位置的內容
程序代碼:
程序測試:
程序分析:用lseek();函數定位到文件末尾後40bit的位置寫入abc,添加了40bit的空洞;用lseek();函數定位到文件開頭後20 bit的位置寫入lalala。
□實驗5.3.2 scandir
用scandir()讀取目錄內容。只顯示以字母開頭的文件。
程序代碼:
程序測試:
程序分析:
參考網站:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=14949191&id=4786163
□□實驗5.2.7映射文件到內存
示例程序: mmap_file_and_insert.c
1.運行示例程序。給出運行結果及分析。
2.用映射文件到內存的方式實現以下功能:
a)刪除文件中的指定內容。
b)允許用戶輸入需要被刪除的位置。
程序1測試:
程序1分析:
將文件hello傳入,用lseek();函數獲得文件的大小,再定位到文件末尾添加大小爲1~2倍頁的大小,在空閒末尾寫入內容,將文件內容映射到內存,輸入添加內容,輸入添加內容的位置,用memmove函數移動要添加位置後面的所有信息,用mecpy函數再將添加內容加入,msync函數寫回磁盤,關閉映射,截斷文件,將多餘空間刪除。
程序2代碼:
程序2測試:
程序分析:
映射到內存,再用memmove函數覆蓋想要刪除的部分,最後寫回磁盤,關閉映射。
★★實驗5.2.8-2死鎖
1.用fcntl()對文件進行鎖操作,模擬一個死鎖的局面。
2.給出程序運行結果及分析。
程序分析:
Lock_1文件先在開頭設置長度爲10的寫鎖,若寫不成功則等待,sleep 10秒,再在文件開頭偏移20的位置設置長度爲10的寫鎖,若寫不成功則等待,sleep 10 秒。
Lock_2文件相反設置,兩文件同時運行,測試能否寫入成功。
程序測試:
第一個加鎖文件代碼(lock_1):
第二個加鎖文件代碼(lock_2):
測試結果:
測試結果並不像預期一樣,可能是Linux排除了死鎖的情況。