2017-4-26
實驗目的
·熟悉read,write等系統呼叫的使用
·通過編寫程式利用相應的系統呼叫實現cp命令
實驗內容
[基本要求]
編寫Linux環境下C程式,使用read,write,close等系統呼叫
[具體要求]
·使用系統呼叫編寫程式實現cp命令的功能
·程式碼有註釋,提交實驗報告
[進一步要求]
·讀入輸入的檔名
·讀入檔案路徑(絕對路徑/相對路徑)
·實現cp命令的功能
實驗報告
1.細節說明
1)cp命令:用於將一個或多個原始檔或者目錄複製到指定的目的檔案或目錄。它可以將單個原始檔複製成一個指定檔名的具體的檔案或一個已經存在的目錄下。
可能涉及的系統呼叫:create、open、close、write、read.
2)open:開啟一個已經存在的檔案(普通檔案、特殊檔案或命名管道),或建立一個新檔案,但它只能建立普通檔案。
定義:
intopen(const char *pathname, int flags);
intopen(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的檔案描述符,出錯返回-1並設定errno
pathname引數:要開啟或建立的檔名,和fopen一樣,pathname既可以是相對路徑也可以是絕對路徑。
flags引數:有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算子連線起來,所以這些常數的巨集定義都以O_開頭,表示or。
必選項:以下三個常數中必須指定一個,且僅允許指定一個。
O_RDONLY只讀開啟
O_WRONLY只寫開啟
O_RDWR可讀可寫開啟
第三個引數mode指定檔案許可權,可以用八進位制數表示,比如0644表示使用者具有讀寫許可權,組使用者和其它使用者具有隻讀許可權
3)close:關閉一個已開啟的檔案
定義
intclose(int fd);
返回值:成功返回0,出錯返回-1並設定errno
引數fd是要關閉的檔案描述符。需要說明的是,當一個程式終止時,核心對該程式所有尚未關閉的檔案描述符
4)create:使用creat函式建立一個新檔案,如果原來該檔案存在,會將這個檔案的長度截短為0
intcreate(const char * pathname, mode_t mode);
如果成功則返回為只寫開啟的檔案描述符,出錯則返回-1。
該函式用於建立一個新檔案,等效於
open(pathname,O_WRONLY | O_CREAT | O_TRUNC, mode)
2.完成情況:
可以做到:讀入輸入的檔名、讀入檔案路徑(包括絕對和相對)、實現cp命令功能(暫時實現一對一的複製)
3.設計思路
設計一個緩衝區,用open開啟原始檔,將檔案內容讀取到緩衝區中,再將緩衝區的內容寫進目標檔案(用create建立的)根據呼叫的返回值判斷是否成功。
4.實驗結果
相對路徑尋找檔案
絕對路徑尋找檔案
5.實驗中遇到的問題
輸入絕對路徑時經常報錯
解決方案:原來是windows路徑名和linux路徑名有差別的問題
在Unix/Linux中,路徑的分隔採用正斜槓"/",比如"/home/hutaow";而在Windows中,路徑分隔採用反斜槓"\",比如"C:\Windows\System"。
補充:
以下面這些開頭的路徑是絕對路徑:
UNC名字,兩個反斜槓開頭\\
碟符冒號加反斜槓開頭,例如C:\
一個反斜槓開頭,例如\file.txt