03Linux系統(tǒng)編程介紹_第1頁
03Linux系統(tǒng)編程介紹_第2頁
03Linux系統(tǒng)編程介紹_第3頁
03Linux系統(tǒng)編程介紹_第4頁
03Linux系統(tǒng)編程介紹_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux系統(tǒng)編程介紹第三章1本章目標系統(tǒng)編程與應用編程系統(tǒng)資源系統(tǒng)調用系統(tǒng)調用與C庫關系錯誤處理2系統(tǒng)編程與應用編程系統(tǒng)編程 在操作系統(tǒng)之上利用系統(tǒng)調用、C庫進行對系統(tǒng)資源進行訪問。如apache 、gcc、gdb 等應用編程 在更高層次的編程接口或者庫之上構建應用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序設計(QT)MFC程序設計(MFC)等。3系統(tǒng)資源處理器輸入輸出進程管理內存設備定時器進程間通信網絡4系統(tǒng)調用在系統(tǒng)中所處的位置所有操作系統(tǒng)都提供多種服務的入口點,由此程序向系統(tǒng)核請求服務。這些入口點被稱之為系統(tǒng)調用(syste

2、m call),5C庫這里我們所說的C庫(libc),指的是標準C定義的函數的集合。如標準輸入輸出函數、字符串處理函數、動態(tài)存儲分配函數、日期時間函數、數學函數等。GNU發(fā)布的libc稱為glibc6系統(tǒng)調用與C庫關系系統(tǒng)調用與庫從形式上來看都C函數C庫函數有些是調用系統(tǒng)調用來實現的,比如說malloc、free調用brk,printf調用write系統(tǒng)用,有些函數不需要任何系統(tǒng)調用,比如abs、strcpy、atoi等,因為它并不是必需要使用內核服務系統(tǒng)調用通常提供的是最小界面,而庫函數通常提供更復雜的功能。7內核如何處理系統(tǒng)調用每個系統(tǒng)調用被賦予一個系統(tǒng)調用號在i386平臺上,執(zhí)行一個系統(tǒng)

3、調用是通過int 0 x80指令完成的。eax存放系統(tǒng)調用號ebx、ecx、edx、esi、edi存儲系統(tǒng)調用參數,對于超過5個參數的系統(tǒng)調用,用一個寄存器指向用戶空間存儲所有系統(tǒng)調用參數的緩存。8錯誤處理在系統(tǒng)編程中錯誤通常通過函數返回值來表示,并通過特殊變量errno來描述。errno這個全局變量在頭文件中聲明如下:extern int errno;錯誤處理函數perrorstrerror9錯誤代碼E2BIG參數列表太長EACCESS權限不足EAGAIN重試EBADF錯誤的文件描述符EBUSY設備或資源忙ECHILD無子進程EDOM數學參數不在函數域內EEXIST文件已存在EFAULT地址

4、錯誤EFBIG文件太大EINTR系統(tǒng)調用被中斷.10總結系統(tǒng)編程與應用編程系統(tǒng)資源系統(tǒng)調用系統(tǒng)調用與C庫關系11文件與I/O(一)第四章12本章目標什么是I/O文件描述符文件系統(tǒng)調用13什么是I/O輸入/輸出是主存和外部設備之間拷貝數據的過程設備-內存 (輸入操作)內存-設備 (輸出操作)高級I/OANSI C提供的標準I/O庫稱為高級I/O,通常也稱為帶緩沖的I/O低級I/O通常也稱為不帶緩沖的I/O14文件描述符對于Linux而言,所有對設備或文件的操作都是通過文件描述符進行的。當打開或者創(chuàng)建一個文件的時候,內核向進程返回一個文件描述符(非負整數)。后續(xù)對文件的操作只需通過該文件描述符,內

5、核記錄有關這個打開文件的信息。一個進程啟動時,默認打開了3個文件,標準輸入、標準輸出、標準錯誤,對應文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),這些常量定義在unistd.h頭文件中。15文件描述符與文件指針轉換fileno:將文件指針轉換為文件描述符fdopen:將文件描述符轉換為文件指針16文件系統(tǒng)調用open系統(tǒng)調用close系統(tǒng)調用creat系統(tǒng)調用read系統(tǒng)調用write系統(tǒng)調用17open系統(tǒng)調用2-1有幾種方法可以獲得允許訪問文件的文件描述符。最常用的是使用open()(打開)系統(tǒng)調用函數原型int open(

6、const char *path, int flags);參數path :文件的名稱,可以包含(絕對和相對)路徑flags:文件打開模式返回值打開成功,返回文件描述符;打開失敗,返回1open系統(tǒng)調用2-2函數原型int open(const char *path, int flags,mode_t mode);參數path :文件的名稱,可以包含(絕對和相對)路徑flags:文件打開模式mode: 用來規(guī)定對該文件的所有者,文件的用戶組及系 統(tǒng)中其他用戶的訪問權限返回值打開成功,返回文件描述符;打開失敗,返回1打開文件的方式打開方式描述O_RDONLY打開一個供讀取的文件O_WRONLY打開

7、一個供寫入的文件O_RDWR打開一個可供讀寫的文件O_APPEND寫入的所有數據將被追加到文件的末尾O_CREAT打開文件,如果文件不存在則建立文件O_EXCL如果已經置O_CREAT且文件存在,則強制open()失敗O_TRUNC在open()時,將文件的內容清空所有這些標志值的符號名稱可以通過#include 訪問訪問權限打開方式描述S_IRUSR文件所有者的讀權限位S_IWUSR文件所有者的寫權限位S_IXUSR文件所有者的執(zhí)行權限位S_IRWXUS_IRUSR|S_IWUSR|S_IXUSRS_IRGRP文件用戶組的讀權限位S_IWGRP文件用戶組的寫權限位S_IXGRP文件用戶組的執(zhí)

8、行權限位S_IRWXGS_IRGRP|S_IWGRP|S_IXGRPS_IROTH文件其他用戶的讀權限位S_IWOTH文件其他用戶的寫權限位S_IXOTH文件其他用戶的執(zhí)行權限位S_IRWXOS_IROTH|S_IWOTH|S_IXOTHopen調用的幾點說明可以利用按位邏輯加(bitwise-OR)(|)對打開方式的標志值進行組合。如打開一個新文件:define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)對訪問權限位進行訪問所用到的標識符,均可以通過include 訪問到,同樣可以通過|運算來對訪問權限進行組合#define MODE755 (S_IRWXU|S_I

9、RGRP|S_IXGRP|S_IROTH|S_IXOTH)close系統(tǒng)調用為了重新利用文件描述符,用close()系統(tǒng)調用釋放打開的文件描述符 函數原型:int close(int fd);函數參數:fd :要關閉的文件的文件描述符返回值如果出現錯誤,返回-1調用成功返回0creat系統(tǒng)調用2-1為了維持與早期的UNIX系統(tǒng)的向后兼容性,Linux也提供可選的創(chuàng)建文件的系統(tǒng)調用,它稱為creat()。函數原型:int creat(const char *path, mode_t mode); 參數path :文件的名稱,可以包含(絕對和相對)路徑mode: 用來規(guī)定對該文件的所有者,文件的用

10、戶組及系 統(tǒng)中其他用戶的訪問權限返回值打開成功,返回文件描述符;打開失敗,返回1creat系統(tǒng)調用(2-2)在UNIX的早期版本中,open()系統(tǒng)調用僅僅存在兩個參數的形式。如文件不存在,它就不能打開這些文件。文件的創(chuàng)建則由單獨的系統(tǒng)調用creat()完成。在Linux及所有UNIX的近代版本中,creat()系統(tǒng)調用是多余的。 creat()調用fd = creat(file, mode);完全等價于近代的open()調用fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);read系統(tǒng)調用一旦有了與一個打開文件描述相連的文件描述符,只要該

11、文件是用O_RDONLY或O_RDWR標志打開的,就可以用read()系統(tǒng)調用從該文件中讀取字節(jié) 函數原型:ssize_t read(int fd, void *buf, size_t count);參數fd :想要讀的文件的文件描述符buf : 指向內存塊的指針,從文件中讀取來的字節(jié)放到這個內存塊中count : 從該文件復制到buf中的字節(jié)個數返回值如果出現錯誤,返回-1讀文件結束,返回0否則返回從該文件復制到規(guī)定的緩沖區(qū)中的字節(jié)數write系統(tǒng)調用用write()系統(tǒng)調用將數據寫到一個文件中 函數原型:ssize_t write(int fd, const void *buf, size

12、_t count);函數參數:fd:要寫入的文件的文件描述符buf: 指向內存塊的指針,從這個內存塊中讀取數據寫入 到文件中count: 要寫入文件的字節(jié)個數返回值如果出現錯誤,返回-1如果寫入成功,則返回寫入到文件中的字節(jié)個數總結什么是I/O文件描述符文件系統(tǒng)調用28文件與I/O(二)第五章29本章目標read、writelseek目錄訪問(opendir、readdir、closedir)rmdir、mkdirchmod、fchmodchown、fchown30read系統(tǒng)調用一旦有了與一個打開文件描述相連的文件描述符,只要該文件是用O_RDONLY或O_RDWR標志打開的,就可以用rea

13、d()系統(tǒng)調用從該文件中讀取字節(jié) 函數原型:ssize_t read(int fd, void *buf, size_t count);參數fd :想要讀的文件的文件描述符buf : 指向內存塊的指針,從文件中讀取來的字節(jié)放到這個內存塊中count : 從該文件復制到buf中的字節(jié)個數返回值如果出現錯誤,返回-1讀文件結束,返回0否則返回從該文件復制到規(guī)定的緩沖區(qū)中的字節(jié)數write系統(tǒng)調用用write()系統(tǒng)調用將數據寫到一個文件中 函數原型:ssize_t write(int fd, const void *buf, size_t count);函數參數:fd:要寫入的文件的文件描述符bu

14、f: 指向內存塊的指針,從這個內存塊中讀取數據寫入 到文件中count: 要寫入文件的字節(jié)個數返回值如果出現錯誤,返回-1如果寫入成功,則返回寫入到文件中的字節(jié)個數文件的隨機讀寫到目前為止的所有文件訪問都是順序訪問。這是因為所有的讀和寫都從當前文件的偏移位置開始,然后文件偏移值自動地增加到剛好超出讀或寫結束時的位置,使它為下一次訪問作好準備。有個文件偏移這樣的機制,在Linux系統(tǒng)中,隨機訪問就變得很簡單,你所需做的只是將當前文件移值改變到有關的位置,它將迫使一次read()或write()發(fā)生在這一位置。(除非文件被O_APPEND打開,在這種情況下,任何write調用仍將發(fā)生在文件結束處)

15、lseek系統(tǒng)調用 1功能說明:通過指定相對于開始位置、當前位置或末尾位置的字節(jié)數來重定位 curp,這取決于 lseek() 函數中指定的位置原型: off_t lseek (int fd, off_t offset, int base);需設置的文件標識符偏移量搜索的起始位置返回值:返回新的文件偏移值lseek系統(tǒng)調用 2base 表示搜索的起始位置,有以下幾個值:(這些值定義在)base文件位置SEEK_SET 從文件開始處計算偏移SEEK_CUR 從當前文件的偏移值計算偏移SEEK_END 從文件的結束處計算偏移目錄訪問 31功能說明:打開一個目錄原型: DIR* opendir(ch

16、ar *pathname);返回值:打開成功,返回一個目錄指針打開失敗,則返回0文件的路徑名目錄訪問 32功能說明:訪問指定目錄中下一個連接的細節(jié)原型: struct dirent* readdir(DIR *dirptr);返回值:返回一個指向dirent結構的指針,它包含指定目錄中下一個連接的細節(jié);沒有更多連接時,返回0目錄指針目錄訪問 33功能說明:關閉一個已經打開的目錄原型:int closedir (DIR *dirptr);返回值:調用成功返回0,失敗返回-1目錄指針目錄信息結構體 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)調用 功能說明:用來創(chuàng)建一個稱為pathname的新目錄,它的權限位設置為mode原型: int mkdir(char *pathname,mode_t mode);返回值:調用成功返回0,失敗返回-1文件的路徑名權限位rmdir系統(tǒng)調用 功能說明:刪除一個空目錄原型: int rmdir(

18、char *pathname);返回值:調用成功返回0,失敗返回-1文件的路徑名chmod和fchmod系統(tǒng)調用 功能說明:用來改變給定路徑名pathname的文件的權限位原型: int chmod (char *pathname, mode_t mode);文件的路徑名權限位返回值:調用成功返回0,失敗返回-1int fchmod (int fd, mode_t mode);文件描述符權限位chown和fchown系統(tǒng)調用 功能說明:用來改變文件所有者的識別號(owner id)或者它的用戶組識別號(group ID)原型: int chown (char *pathname, uid_t

19、owner,gid_t group);文件的路徑名所有者識別號返回值:調用成功返回0,失敗返回-1int fchown (int fd, uid_t owner,gid_t group);文件描述符用戶組識別號所有者識別號用戶組識別號總結read、writelseek目錄訪問(opendir、readdir、closedir)rmdir、mkdirchmod、fchmodchown、fchown44文件與I/O(三)第六章45本章目標statstat結構體stat示例46stat功能:讀取文件元數據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結構體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è)實現ls -l功能lstatgetpwuidgetgrgidreadlink49總結statstat結構體stat示例50文件與I/O(四)第七章51本章目標文件共享打開文件內核數據結構一個進程兩次打開同一個文件兩個進程打開同一個文件復制文件描述符(dup、dup2、fcntl)52文件共享(31)53文件狀態(tài)標志:讀、寫、追加、同步、非阻塞等文件共享(32)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論