1. <dd id="erndk"></dd>
                1. LInux系統編程入門

                  互聯網 2022/5/2 7:16:05

                  一、GCC GCC(GNU Compiler Collection,GNU 編譯器套件)是由 GNU 開發的編程語言編譯器。GCC包括 C、C++、Objective-C、Java、Ada 和 Go 語言前端,也包括了這些語言的庫(如 libstdc++, libgcj等) GCC可以使用命令行選項來控制編譯器在翻譯源代碼事應該遵循哪個C標…

                  一、GCC 

                  GCC(GNU Compiler Collection,GNU 編譯器套件)是由 GNU 開發的編程語言編譯器。GCC包括 C、C++、Objective-C、Java、Ada 和 Go 語言前端,也包括了這些語言的庫(如 libstdc++, libgcj等)

                  GCC可以使用命令行選項來控制編譯器在翻譯源代碼事應該遵循哪個C標準。例如,“-std = c99”啟動GCC時,編譯器支持C99標準。

                  安裝命令 sudo apt install gcc g++

                  查看版本 gcc/g++ -v/--version

                   

                   

                   

                  GCC工作流程

                   

                   GCC常用參數選項

                   

                   

                  二、靜態庫與動態庫

                  庫文件時計算機上的一類文件,可以簡單的把庫文件看成一種代碼倉庫,它提供給使用者一些可以直接拿來用的變量、函數或類。

                  庫是一種特殊的程序,編寫庫和編寫一般的程序區別不大,只是庫不能單獨運行。

                  庫文件有兩種,靜態庫和動態庫(共享庫),區別是:靜態庫在程序的鏈接階段被復制到了程序中;動態庫在運行時由系統加載到內存中供程序使用。

                  庫的好處:代碼保密;方便部署和開發

                  靜態庫的制作

                   

                   

                   

                  動態庫的制作

                   

                  工作原理

                  程序啟動之后,動態庫會被動態加載到內存中,通過 ldd (list dynamic dependencies)命令檢查動態庫依賴關系

                  當系統加載可執行代碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路 徑。此時就需要系統的動態載入器來獲取該絕對路徑。對于elf格式的可執行程序,是 由ld-linux.so來完成的,它先后搜索elf文件的 DT_RPATH段 ——> 環境變量 LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib 目錄找到庫文件后將其載入內存。

                  靜態庫的優缺點

                  優點:靜態庫被打包到應用程序中,加載速度快;發布程序無需提供靜態庫,移植方便

                  缺點:消耗系統資源,浪費內存;庫的更新、部署、發布麻煩

                  動態庫的優缺點

                  優點:可以實現進程間資源共享(共享庫);更新、部署、發布簡單;可以控制何時加載動態庫

                  缺點:加載速度比靜態庫慢;發布程序時需要提供依賴的動態庫

                  三、Makefile

                  Makefile的作用是“自動化編譯”,Makefile文件定義了一系列的規則,指定了文件編譯的順序,以及是否需要重新編譯和更復雜的功能操作。

                  make 是一個命令工具,是一個 解釋 Makefile 文件中指令的命令工具,一般來說,大多數的 IDE 都有這個命令, 比如 Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。

                  Makefile文件命名和規則

                   

                  工作原理

                   

                  變量

                   

                  模式匹配

                   

                  函數

                   

                   

                   

                  四、GDB調試

                  GDB 是由 GNU 軟件系統社區提供的調試工具,同 GCC 配套組成了一套完整的開發環 境,GDB 是 Linux 和許多類 Unix 系統中的標準開發環境。

                  一般來說,GDB 主要幫助你完成下面四個方面的功能: 1. 啟動程序,可以按照自定義的要求隨心所欲的運行程序 2. 可讓被調試的程序在所指定的調置的斷點處停?。〝帱c可以是條件表達式) 3. 當程序被停住時,可以檢查此時程序中所發生的事 4. 可以改變程序,將一個 BUG 產生的影響修正從而測試其他 BUG

                  準備工作

                  關掉編譯器的優化選項(`-O`), 并打開調 試選項(`-g`)。另外,`-Wall`在盡量不影響程序行為的情況下選項打開所有 warning,也可以發現許多問題,避免一些不必要的 BUG。

                  gcc -g -Wall program.c -o program

                  `-g` 選項的作用是在可執行文件中加入源代碼的信息,比如可執行文件中第幾條機 器指令對應源代碼的第幾行,但并不是把整個源文件嵌入到可執行文件中,所以在調 試時必須保證 gdb 能找到源文件。

                  GDB命令

                   

                   

                   

                   

                   

                   

                  五、文件IO

                  標準C庫IO函數

                   

                  標準C庫IO與linux系統IO的關系

                   

                  虛擬地址空間

                   

                  文件描述符

                   

                  Linux系統IO函數

                   

                   lstat是查看軟連接的狀態

                  stat結構體

                   

                  st_mode變量

                   

                  文件屬性操作函數

                  #include <unistd.h> int access(const char *pathname, int mode); ? ? 作用:判斷某個文件是否有某個權限,或者判斷文件是否存在 ? ? 參數: ? ? ? ? - pathname: 判斷的文件路徑 ? ? ? ? - mode: ? ? ? ? ? ? R_OK: 判斷是否有讀權限 ? ? ? ? ? ? W_OK: 判斷是否有寫權限 ? ? ? ? ? ? X_OK: 判斷是否有執行權限 ? ? ? ? ? ? F_OK: 判斷文件是否存在 ? ? 返回值:成功返回0, 失敗返回-1 ? #include <sys/stat.h> int chmod(const char *pathname, mode_t mode); ? ? 修改文件的權限 ? ? 參數: ? ? ? ? - pathname: 需要修改的文件的路徑 ? ? ? ? - mode:需要修改的權限值,八進制的數 ? ? 返回值:成功返回0,失敗返回-1 ? #include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); ? ? 作用:縮減或者擴展文件的尺寸至指定的大小 ? ? 參數: ? ? ? ? - path: 需要修改的文件的路徑 ? ? ? ? - length: 需要最終文件變成的大小 ? ? 返回值: ? ? ? ? 成功返回0, 失敗返回-1

                  目錄操作函數

                   

                  #include <unistd.h> int chdir(const char *path); ? ? 作用:修改進程的工作目錄 ? ? ? ? 比如在/home/nowcoder 啟動了一個可執行程序a.out, 進程的工作目錄 /home/nowcoder ? ? 參數: ? ? ? ? path : 需要修改的工作目錄
                  #include <unistd.h> char *getcwd(char *buf, size_t size); ? ? 作用:獲取當前工作目錄 ? ? 參數: ? ? ? ? - buf : 存儲的路徑,指向的是一個數組(傳出參數) ? ? ? ? - size: 數組的大小 ? ? 返回值: ? ? ? ? 返回的指向的一塊內存,這個數據就是第一個參數 ? #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); ? ? 作用:創建一個目錄 ? ? 參數: ? ? ? ? pathname: 創建的目錄的路徑 ? ? ? ? mode: 權限,八進制的數 ? ? 返回值: ? ? ? ? 成功返回0, 失敗返回-1

                  目錄遍歷函數

                  // 打開一個目錄 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); ? ? 參數: ? ? ? ? - name: 需要打開的目錄的名稱 ? ? 返回值: ? ? ? ? DIR * 類型,理解為目錄流 ? ? ? ? 錯誤返回NULL

                  // 讀取目錄中的數據 #include <dirent.h> struct dirent *readdir(DIR *dirp); ? ? - 參數:dirp是opendir返回的結果 ? ? - 返回值: ? ? ? ? struct dirent,代表讀取到的文件的信息 ? ? ? ? 讀取到了末尾或者失敗了,返回NULL
                  // 關閉目錄 #include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp);

                  dirent結構體和d_type

                   

                  dup和dup2函數

                   

                  #include <unistd.h> int dup(int oldfd); ? ? 作用:復制一個新的文件描述符 ? ? fd=3, int fd1 = dup(fd), ? ? fd指向的是a.txt, fd1也是指向a.txt ? ? 從空閑的文件描述符表中找一個最小的,作為新的拷貝的文件描述符 ? #include <unistd.h> int dup2(int oldfd, int newfd); ? ? 作用:重定向文件描述符 ? ? oldfd 指向 a.txt, newfd 指向 b.txt ? ? 調用函數成功后:newfd 和 b.txt 做close, newfd 指向了 a.txt ? ? oldfd 必須是一個有效的文件描述符 ? ? oldfd和newfd值相同,相當于什么都沒有做

                  fcntl函數

                   

                  #include <unistd.h> #include <fcntl.h>
                  int fcntl(int fd, int cmd, ...); 參數: ? ? fd : 表示需要操作的文件描述符 ? ? cmd: 表示對文件描述符進行如何操作 ? ? ? ? - F_DUPFD : 復制文件描述符,復制的是第一個參數fd,得到一個新的文件描述符(返回值) ? ? ? ? ? ? int ret = fcntl(fd, F_DUPFD);
                  ? ? ? ? - F_GETFL : 獲取指定的文件描述符文件狀態flag ? ? ? ? ? ? 獲取的flag和我們通過open函數傳遞的flag是一個東西。
                  ? ? ? ? - F_SETFL : 設置文件描述符文件狀態flag ? ? ? ? ? ? 必選項:O_RDONLY, O_WRONLY, O_RDWR 不可以被修改 ? ? ? ? ? ? 可選性:O_APPEND, O)NONBLOCK ? ? ? ? ? ? O_APPEND 表示追加數據 ? ? ? ? ? ? NONBLOK 設置成非阻塞 ? ? ? ? 阻塞和非阻塞:描述的是函數調用的行為。

                   

                   

                   

                   

                  參考資料:??蚦++項目實戰

                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [LInux系統編程入門]http://www.yachtsalesaustralia.com/tech/detail-318697.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>