




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Linux系統(tǒng)編程介紹第三章1本章目標系統(tǒng)編程與應(yīng)用編程系統(tǒng)資源系統(tǒng)調(diào)用系統(tǒng)調(diào)用與C庫關(guān)系錯誤處理2系統(tǒng)編程與應(yīng)用編程系統(tǒng)編程 在操作系統(tǒng)之上利用系統(tǒng)調(diào)用、C庫進行對系統(tǒng)資源進行訪問。如apache 、gcc、gdb 等應(yīng)用編程 在更高層次的編程接口或者庫之上構(gòu)建應(yīng)用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序設(shè)計(QT)MFC程序設(shè)計(MFC)等。3系統(tǒng)資源處理器輸入輸出進程管理內(nèi)存設(shè)備定時器進程間通信網(wǎng)絡(luò)4系統(tǒng)調(diào)用在系統(tǒng)中所處的位置所有操作系統(tǒng)都提供多種服務(wù)的入口點,由此程序向系統(tǒng)核請求服務(wù)。這些入口點被稱之為系統(tǒng)調(diào)用(syste
2、m call),5C庫這里我們所說的C庫(libc),指的是標準C定義的函數(shù)的集合。如標準輸入輸出函數(shù)、字符串處理函數(shù)、動態(tài)存儲分配函數(shù)、日期時間函數(shù)、數(shù)學(xué)函數(shù)等。GNU發(fā)布的libc稱為glibc6系統(tǒng)調(diào)用與C庫關(guān)系系統(tǒng)調(diào)用與庫從形式上來看都C函數(shù)C庫函數(shù)有些是調(diào)用系統(tǒng)調(diào)用來實現(xiàn)的,比如說malloc、free調(diào)用brk,printf調(diào)用write系統(tǒng)用,有些函數(shù)不需要任何系統(tǒng)調(diào)用,比如abs、strcpy、atoi等,因為它并不是必需要使用內(nèi)核服務(wù)系統(tǒng)調(diào)用通常提供的是最小界面,而庫函數(shù)通常提供更復(fù)雜的功能。7內(nèi)核如何處理系統(tǒng)調(diào)用每個系統(tǒng)調(diào)用被賦予一個系統(tǒng)調(diào)用號在i386平臺上,執(zhí)行一個系統(tǒng)
3、調(diào)用是通過int 0 x80指令完成的。eax存放系統(tǒng)調(diào)用號ebx、ecx、edx、esi、edi存儲系統(tǒng)調(diào)用參數(shù),對于超過5個參數(shù)的系統(tǒng)調(diào)用,用一個寄存器指向用戶空間存儲所有系統(tǒng)調(diào)用參數(shù)的緩存。8錯誤處理在系統(tǒng)編程中錯誤通常通過函數(shù)返回值來表示,并通過特殊變量errno來描述。errno這個全局變量在頭文件中聲明如下:extern int errno;錯誤處理函數(shù)perrorstrerror9錯誤代碼E2BIG參數(shù)列表太長EACCESS權(quán)限不足EAGAIN重試EBADF錯誤的文件描述符EBUSY設(shè)備或資源忙ECHILD無子進程EDOM數(shù)學(xué)參數(shù)不在函數(shù)域內(nèi)EEXIST文件已存在EFAULT地址
4、錯誤EFBIG文件太大EINTR系統(tǒng)調(diào)用被中斷.10總結(jié)系統(tǒng)編程與應(yīng)用編程系統(tǒng)資源系統(tǒng)調(diào)用系統(tǒng)調(diào)用與C庫關(guān)系11文件與I/O(一)第四章12本章目標什么是I/O文件描述符文件系統(tǒng)調(diào)用13什么是I/O輸入/輸出是主存和外部設(shè)備之間拷貝數(shù)據(jù)的過程設(shè)備-內(nèi)存 (輸入操作)內(nèi)存-設(shè)備 (輸出操作)高級I/OANSI C提供的標準I/O庫稱為高級I/O,通常也稱為帶緩沖的I/O低級I/O通常也稱為不帶緩沖的I/O14文件描述符對于Linux而言,所有對設(shè)備或文件的操作都是通過文件描述符進行的。當打開或者創(chuàng)建一個文件的時候,內(nèi)核向進程返回一個文件描述符(非負整數(shù))。后續(xù)對文件的操作只需通過該文件描述符,內(nèi)
5、核記錄有關(guān)這個打開文件的信息。一個進程啟動時,默認打開了3個文件,標準輸入、標準輸出、標準錯誤,對應(yīng)文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),這些常量定義在unistd.h頭文件中。15文件描述符與文件指針轉(zhuǎn)換fileno:將文件指針轉(zhuǎn)換為文件描述符fdopen:將文件描述符轉(zhuǎn)換為文件指針16文件系統(tǒng)調(diào)用open系統(tǒng)調(diào)用close系統(tǒng)調(diào)用creat系統(tǒng)調(diào)用read系統(tǒng)調(diào)用write系統(tǒng)調(diào)用17open系統(tǒng)調(diào)用2-1有幾種方法可以獲得允許訪問文件的文件描述符。最常用的是使用open()(打開)系統(tǒng)調(diào)用函數(shù)原型int open(
6、const char *path, int flags);參數(shù)path :文件的名稱,可以包含(絕對和相對)路徑flags:文件打開模式返回值打開成功,返回文件描述符;打開失敗,返回1open系統(tǒng)調(diào)用2-2函數(shù)原型int open(const char *path, int flags,mode_t mode);參數(shù)path :文件的名稱,可以包含(絕對和相對)路徑flags:文件打開模式mode: 用來規(guī)定對該文件的所有者,文件的用戶組及系 統(tǒng)中其他用戶的訪問權(quán)限返回值打開成功,返回文件描述符;打開失敗,返回1打開文件的方式打開方式描述O_RDONLY打開一個供讀取的文件O_WRONLY打開
7、一個供寫入的文件O_RDWR打開一個可供讀寫的文件O_APPEND寫入的所有數(shù)據(jù)將被追加到文件的末尾O_CREAT打開文件,如果文件不存在則建立文件O_EXCL如果已經(jīng)置O_CREAT且文件存在,則強制open()失敗O_TRUNC在open()時,將文件的內(nèi)容清空所有這些標志值的符號名稱可以通過#include 訪問訪問權(quán)限打開方式描述S_IRUSR文件所有者的讀權(quán)限位S_IWUSR文件所有者的寫權(quán)限位S_IXUSR文件所有者的執(zhí)行權(quán)限位S_IRWXUS_IRUSR|S_IWUSR|S_IXUSRS_IRGRP文件用戶組的讀權(quán)限位S_IWGRP文件用戶組的寫權(quán)限位S_IXGRP文件用戶組的執(zhí)
8、行權(quán)限位S_IRWXGS_IRGRP|S_IWGRP|S_IXGRPS_IROTH文件其他用戶的讀權(quán)限位S_IWOTH文件其他用戶的寫權(quán)限位S_IXOTH文件其他用戶的執(zhí)行權(quán)限位S_IRWXOS_IROTH|S_IWOTH|S_IXOTHopen調(diào)用的幾點說明可以利用按位邏輯加(bitwise-OR)(|)對打開方式的標志值進行組合。如打開一個新文件:define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)對訪問權(quán)限位進行訪問所用到的標識符,均可以通過include 訪問到,同樣可以通過|運算來對訪問權(quán)限進行組合#define MODE755 (S_IRWXU|S_I
9、RGRP|S_IXGRP|S_IROTH|S_IXOTH)close系統(tǒng)調(diào)用為了重新利用文件描述符,用close()系統(tǒng)調(diào)用釋放打開的文件描述符 函數(shù)原型:int close(int fd);函數(shù)參數(shù):fd :要關(guān)閉的文件的文件描述符返回值如果出現(xiàn)錯誤,返回-1調(diào)用成功返回0creat系統(tǒng)調(diào)用2-1為了維持與早期的UNIX系統(tǒng)的向后兼容性,Linux也提供可選的創(chuàng)建文件的系統(tǒng)調(diào)用,它稱為creat()。函數(shù)原型:int creat(const char *path, mode_t mode); 參數(shù)path :文件的名稱,可以包含(絕對和相對)路徑mode: 用來規(guī)定對該文件的所有者,文件的用
10、戶組及系 統(tǒng)中其他用戶的訪問權(quán)限返回值打開成功,返回文件描述符;打開失敗,返回1creat系統(tǒng)調(diào)用(2-2)在UNIX的早期版本中,open()系統(tǒng)調(diào)用僅僅存在兩個參數(shù)的形式。如文件不存在,它就不能打開這些文件。文件的創(chuàng)建則由單獨的系統(tǒng)調(diào)用creat()完成。在Linux及所有UNIX的近代版本中,creat()系統(tǒng)調(diào)用是多余的。 creat()調(diào)用fd = creat(file, mode);完全等價于近代的open()調(diào)用fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);read系統(tǒng)調(diào)用一旦有了與一個打開文件描述相連的文件描述符,只要該
11、文件是用O_RDONLY或O_RDWR標志打開的,就可以用read()系統(tǒng)調(diào)用從該文件中讀取字節(jié) 函數(shù)原型:ssize_t read(int fd, void *buf, size_t count);參數(shù)fd :想要讀的文件的文件描述符buf : 指向內(nèi)存塊的指針,從文件中讀取來的字節(jié)放到這個內(nèi)存塊中count : 從該文件復(fù)制到buf中的字節(jié)個數(shù)返回值如果出現(xiàn)錯誤,返回-1讀文件結(jié)束,返回0否則返回從該文件復(fù)制到規(guī)定的緩沖區(qū)中的字節(jié)數(shù)write系統(tǒng)調(diào)用用write()系統(tǒng)調(diào)用將數(shù)據(jù)寫到一個文件中 函數(shù)原型:ssize_t write(int fd, const void *buf, size
12、_t count);函數(shù)參數(shù):fd:要寫入的文件的文件描述符buf: 指向內(nèi)存塊的指針,從這個內(nèi)存塊中讀取數(shù)據(jù)寫入 到文件中count: 要寫入文件的字節(jié)個數(shù)返回值如果出現(xiàn)錯誤,返回-1如果寫入成功,則返回寫入到文件中的字節(jié)個數(shù)總結(jié)什么是I/O文件描述符文件系統(tǒng)調(diào)用28文件與I/O(二)第五章29本章目標read、writelseek目錄訪問(opendir、readdir、closedir)rmdir、mkdirchmod、fchmodchown、fchown30read系統(tǒng)調(diào)用一旦有了與一個打開文件描述相連的文件描述符,只要該文件是用O_RDONLY或O_RDWR標志打開的,就可以用rea
13、d()系統(tǒng)調(diào)用從該文件中讀取字節(jié) 函數(shù)原型:ssize_t read(int fd, void *buf, size_t count);參數(shù)fd :想要讀的文件的文件描述符buf : 指向內(nèi)存塊的指針,從文件中讀取來的字節(jié)放到這個內(nèi)存塊中count : 從該文件復(fù)制到buf中的字節(jié)個數(shù)返回值如果出現(xiàn)錯誤,返回-1讀文件結(jié)束,返回0否則返回從該文件復(fù)制到規(guī)定的緩沖區(qū)中的字節(jié)數(shù)write系統(tǒng)調(diào)用用write()系統(tǒng)調(diào)用將數(shù)據(jù)寫到一個文件中 函數(shù)原型:ssize_t write(int fd, const void *buf, size_t count);函數(shù)參數(shù):fd:要寫入的文件的文件描述符bu
14、f: 指向內(nèi)存塊的指針,從這個內(nèi)存塊中讀取數(shù)據(jù)寫入 到文件中count: 要寫入文件的字節(jié)個數(shù)返回值如果出現(xiàn)錯誤,返回-1如果寫入成功,則返回寫入到文件中的字節(jié)個數(shù)文件的隨機讀寫到目前為止的所有文件訪問都是順序訪問。這是因為所有的讀和寫都從當前文件的偏移位置開始,然后文件偏移值自動地增加到剛好超出讀或?qū)懡Y(jié)束時的位置,使它為下一次訪問作好準備。有個文件偏移這樣的機制,在Linux系統(tǒng)中,隨機訪問就變得很簡單,你所需做的只是將當前文件移值改變到有關(guān)的位置,它將迫使一次read()或write()發(fā)生在這一位置。(除非文件被O_APPEND打開,在這種情況下,任何write調(diào)用仍將發(fā)生在文件結(jié)束處)
15、lseek系統(tǒng)調(diào)用 1功能說明:通過指定相對于開始位置、當前位置或末尾位置的字節(jié)數(shù)來重定位 curp,這取決于 lseek() 函數(shù)中指定的位置原型: off_t lseek (int fd, off_t offset, int base);需設(shè)置的文件標識符偏移量搜索的起始位置返回值:返回新的文件偏移值lseek系統(tǒng)調(diào)用 2base 表示搜索的起始位置,有以下幾個值:(這些值定義在)base文件位置SEEK_SET 從文件開始處計算偏移SEEK_CUR 從當前文件的偏移值計算偏移SEEK_END 從文件的結(jié)束處計算偏移目錄訪問 31功能說明:打開一個目錄原型: DIR* opendir(ch
16、ar *pathname);返回值:打開成功,返回一個目錄指針打開失敗,則返回0文件的路徑名目錄訪問 32功能說明:訪問指定目錄中下一個連接的細節(jié)原型: struct dirent* readdir(DIR *dirptr);返回值:返回一個指向dirent結(jié)構(gòu)的指針,它包含指定目錄中下一個連接的細節(jié);沒有更多連接時,返回0目錄指針目錄訪問 33功能說明:關(guān)閉一個已經(jīng)打開的目錄原型:int closedir (DIR *dirptr);返回值:調(diào)用成功返回0,失敗返回-1目錄指針目錄信息結(jié)構(gòu)體 struct dirent long d_ino; /* inode number */ off_t
17、 d_off; /* offset to this dirent */ unsigned short d_reclen; /* length of this d_name */ char d_name NAME_MAX+1; /* file name (null-terminated) */ mkdir系統(tǒng)調(diào)用 功能說明:用來創(chuàng)建一個稱為pathname的新目錄,它的權(quán)限位設(shè)置為mode原型: int mkdir(char *pathname,mode_t mode);返回值:調(diào)用成功返回0,失敗返回-1文件的路徑名權(quán)限位rmdir系統(tǒng)調(diào)用 功能說明:刪除一個空目錄原型: int rmdir(
18、char *pathname);返回值:調(diào)用成功返回0,失敗返回-1文件的路徑名chmod和fchmod系統(tǒng)調(diào)用 功能說明:用來改變給定路徑名pathname的文件的權(quán)限位原型: int chmod (char *pathname, mode_t mode);文件的路徑名權(quán)限位返回值:調(diào)用成功返回0,失敗返回-1int fchmod (int fd, mode_t mode);文件描述符權(quán)限位chown和fchown系統(tǒng)調(diào)用 功能說明:用來改變文件所有者的識別號(owner id)或者它的用戶組識別號(group ID)原型: int chown (char *pathname, uid_t
19、owner,gid_t group);文件的路徑名所有者識別號返回值:調(diào)用成功返回0,失敗返回-1int fchown (int fd, uid_t owner,gid_t group);文件描述符用戶組識別號所有者識別號用戶組識別號總結(jié)read、writelseek目錄訪問(opendir、readdir、closedir)rmdir、mkdirchmod、fchmodchown、fchown44文件與I/O(三)第六章45本章目標statstat結(jié)構(gòu)體stat示例46stat功能:讀取文件元數(shù)據(jù)47int stat(const char *path, struct stat *buf);i
20、nt fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);stat結(jié)構(gòu)體struct stat dev_t st_dev; /* ID of device containing file */ino_t st_ino; /* inode number */mode_t st_mode; /* protection */nlink_t st_nlink; /* number of hard links */uid_t st_uid; /* user ID of owner */gid_t st
21、_gid; /* group ID of owner */dev_t st_rdev; /* device ID (if special file) */off_t st_size; /* total size, in bytes */blksize_t st_blksize; /* blocksize for file system I/O */blkcnt_t st_blocks; /* number of 512B blocks allocated */time_t st_atime; /* time of last access */time_t st_mtime; /* time of last modification */time_t st_ctime; /* time of last status change */;48課后作業(yè)實現(xiàn)ls -l功能lstatgetpwuidgetgrgidreadlink49總結(jié)statstat結(jié)構(gòu)體stat示例50文件與I/O(四)第七章51本章目標文件共享打開文件內(nèi)核數(shù)據(jù)結(jié)構(gòu)一個進程兩次打開同一個文件兩個進程打開同一個文件復(fù)制文件描述符(dup、dup2、fcntl)52文件共享(31)53文件狀態(tài)標志:讀、寫、追加、同步、非阻塞等文件共享(32)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 滬科版 信息技術(shù) 必修 3.2.2 信息作品的制作 教學(xué)設(shè)計
- 麗江師范高等??茖W(xué)?!稌媽嵱?xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙教版2023小學(xué)信息技術(shù)六年級上冊《算法的評價方法》教學(xué)設(shè)計及反思
- Unit 3 Family ties Starting out教學(xué)設(shè)計 -2024-2025學(xué)年外研版英語七年級上冊
- 中學(xué)聯(lián)盟浙江省蒼南縣龍港鎮(zhèn)第四中學(xué)人教版七年級歷史與社會上冊教學(xué)設(shè)計:3.1.1 稻作文化的印記(第1課時)
- 人教版七年級上冊第三章第一節(jié)家住平原教學(xué)設(shè)計
- 天津中醫(yī)藥大學(xué)《材料力學(xué)C》2023-2024學(xué)年第二學(xué)期期末試卷
- 宿遷澤達職業(yè)技術(shù)學(xué)院《建筑專題設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 河源2025年廣東河源市中醫(yī)院招聘合同制人員筆試歷年參考題庫附帶答案詳解
- 黃淮學(xué)院《智能制造系統(tǒng)集成技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新能源充電樁安全管理與防護
- QCT848-2023拉臂式自裝卸裝置
- 人教版八年級下冊英語默寫(單詞 重點短語 重點句型)含答案
- 歷史類常識考試100題帶答案(能力提升)
- MOOC 研究生學(xué)術(shù)規(guī)范與學(xué)術(shù)誠信-南京大學(xué) 中國大學(xué)慕課答案
- 大學(xué)生生涯發(fā)展報告新能源汽車
- JBT 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規(guī)程
- 護理干預(yù)在慢性病管理中的作用
- 托幼托育工作總結(jié)
- 2024年河南水利與環(huán)境職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 四肢癱瘓的護理查房
評論
0/150
提交評論