行)
簡介本資源是一份面向高校計(jì)算機(jī)專業(yè)本科生的操作系統(tǒng)課程實(shí)驗(yàn)報(bào)告聚焦Linux用戶接口與編程環(huán)境的實(shí)踐入門幫助初學(xué)者系統(tǒng)掌握命令行操作、系統(tǒng)管理基礎(chǔ)及C/Shell程序開發(fā)全流程。資源為1個(gè)609KB的Word文檔.docx完整覆蓋5大實(shí)驗(yàn)?zāi)KLinux常用命令詳解ls/uname/man/pwd等參數(shù)用法、U盤掛載與卸載實(shí)操、vi/vim編輯器基礎(chǔ)操作、GCC編譯運(yùn)行C程序步驟、Shell腳本三種執(zhí)行方式另含root與sudo權(quán)限機(jī)制的原理說明與安全使用建議。內(nèi)容結(jié)構(gòu)清晰命令示例詳實(shí)附帶關(guān)鍵參數(shù)對比和典型應(yīng)用場景解析便于對照復(fù)現(xiàn)與課后鞏固。目前已有107人學(xué)習(xí)下載適合作為操作系統(tǒng)實(shí)驗(yàn)課配套材料、Linux入門自學(xué)筆記或期末復(fù)習(xí)參考文檔。1. 這不是“黑屏命令行”而是你操作系統(tǒng)的第一雙眼睛Linux用戶接口到底在說什么你第一次點(diǎn)開終端看到一個(gè)閃爍的光標(biāo)敲下ls回車后跳出一堆文件名——那一刻你可能以為自己在“用命令”其實(shí)你正在和操作系統(tǒng)“對話”。這根本不是什么玄學(xué)操作而是一套設(shè)計(jì)得非常清晰的「人機(jī)接口」Linux 的字符界面也就是常說的 Terminal / Shell就是操作系統(tǒng)為你準(zhǔn)備的第一雙眼睛、第一雙手。它不靠圖標(biāo)和菜單而是用文字指令告訴你“系統(tǒng)現(xiàn)在什么樣”“我能做什么”“文件藏在哪”“程序怎么跑起來”。比如ls -a不是亂加字母而是說“把當(dāng)前目錄里所有東西——連那些名字前面帶點(diǎn).的‘隱身文件’——都給我列出來”man ls更不是打開說明書而是直接喊來一位隨叫隨到的“系統(tǒng)向?qū)А闭驹谀闵磉呉痪渚浣忉宭s能干什么、每個(gè)參數(shù)什么意思、連新手常踩的坑都提前標(biāo)好了。這份實(shí)驗(yàn)材料就是帶你從“不敢敲回車”變成“知道敲完會(huì)發(fā)生什么”的第一步它不教你造操作系統(tǒng)但教會(huì)你真正看懂、摸清、用活你每天打交道的那個(gè)系統(tǒng)。適合誰零基礎(chǔ)剛裝好 Linux 虛擬機(jī)的同學(xué)、寫 Python 卻總卡在“怎么把代碼變成可運(yùn)行文件”的初學(xué)者、還有被老師布置了“交一份 Linux 實(shí)驗(yàn)報(bào)告”卻連pwd和cd都分不清的你——?jiǎng)e怕我們從光標(biāo)開始一招一式全拆給你看。2. 先搞懂三類命令查狀態(tài)、看幫助、管文件——它們是你每天必用的“操作系統(tǒng)遙控器”Linux 終端里上百條命令新手根本不用全記。真正天天用、次次離不開的就這三類查系統(tǒng)狀態(tài)的比如你現(xiàn)在用的是什么系統(tǒng)、幾點(diǎn)了、誰登錄著、查幫助文檔的遇到不會(huì)的命令3 秒內(nèi)知道怎么用、管文件和目錄的創(chuàng)建、刪掉、看看里面有什么。它們就像遙控器上的“電源鍵、音量鍵、頻道鍵”——不多但按對了整個(gè)系統(tǒng)就聽你指揮。下面我們就用實(shí)驗(yàn)里最核心的幾個(gè)命令手把手帶你走一遍真實(shí)操作流不是背參數(shù)而是理解“為什么這樣設(shè)計(jì)”“我敲下去系統(tǒng)在后臺(tái)干了什么”。2.1 查系統(tǒng)狀態(tài)uname和date不是報(bào)菜名是在讀取系統(tǒng)“身份證”uname這個(gè)命令名字看著像英文單詞其實(shí)它干的事特別實(shí)在讀取內(nèi)核給你的“系統(tǒng)身份證”。你電腦上跑的是哪個(gè)版本的 Linux是 64 位還是 32 位主機(jī)叫什么名字這些信息不是存在某個(gè)配置文件里讓你去翻而是內(nèi)核實(shí)時(shí)維護(hù)的一組“狀態(tài)快照”uname就是那個(gè)專門負(fù)責(zé)把快照內(nèi)容翻譯成你能看懂的文字的工具。uname -a這條命令會(huì)一次性輸出全部信息典型結(jié)果長這樣Linux ubuntu2204 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:37:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux我們來逐段“翻譯”Linux這是內(nèi)核名稱-s參數(shù)單獨(dú)輸出的就是這個(gè)ubuntu2204這是你的主機(jī)名-n參數(shù)單獨(dú)輸出的就是這個(gè)相當(dāng)于你電腦的“小名”5.15.0-91-generic這是內(nèi)核發(fā)行版本號(hào)-r參數(shù)輸出它決定了你系統(tǒng)底層能支持哪些新硬件、哪些安全補(bǔ)丁x86_64這是硬件平臺(tái)-i參數(shù)輸出說明你用的是主流的 64 位 Intel/AMD CPU最后一串GNU/Linux是操作系統(tǒng)類型表示這是基于 GNU 工具鏈的 Linux 系統(tǒng)。提示uname -a是新手最該記住的“一鍵體檢”命令。當(dāng)你裝完系統(tǒng)、配完環(huán)境、或者別人問你“你用的是什么系統(tǒng)”敲這一行截圖發(fā)過去比說一百句都清楚。再來看date它更直白告訴系統(tǒng)“現(xiàn)在幾點(diǎn)了”然后系統(tǒng)就把當(dāng)前時(shí)間原樣吐給你。但它背后有個(gè)重要細(xì)節(jié)Linux 系統(tǒng)里有兩個(gè)“時(shí)間”——硬件時(shí)鐘RTC關(guān)機(jī)也走和系統(tǒng)時(shí)鐘OS Clock開機(jī)才啟動(dòng)。date讀的是系統(tǒng)時(shí)鐘所以如果你發(fā)現(xiàn)時(shí)間不準(zhǔn)不是date命令錯(cuò)了而是系統(tǒng)時(shí)鐘沒同步。不過對新手來說先學(xué)會(huì)用date看時(shí)間、用date %Y-%m-%d %H:%M自定義格式比如只顯示年月日時(shí)分就夠用了。2.2 查幫助文檔man不是翻書是喚醒一個(gè)住在終端里的“活體說明書”很多新手一看到man ls就懵屏幕突然變黑、上下鍵能動(dòng)、但不知道怎么退出。這不是 bug是man的默認(rèn)閱讀器less在工作——它把幫助文檔當(dāng)“長文本”來處理而不是彈窗。你可以把它想象成一個(gè)極簡版的 PDF 閱讀器按空格鍵或CtrlF往下翻一頁按b鍵往上翻一頁按/鍵輸入關(guān)鍵詞搜索比如/hidden就能快速定位到關(guān)于隱藏文件的說明按q鍵立刻退出回到命令行——這是最重要的退出鍵務(wù)必記住。man ls執(zhí)行后你會(huì)看到一大段英文中文系統(tǒng)可能是中文但原理一樣。重點(diǎn)看開頭的 SYNOPSIS概要部分ls [OPTION]... [FILE]...這句話的意思是“l(fā)s后面可以跟零個(gè)或多個(gè)選項(xiàng)OPTION再跟零個(gè)或多個(gè)文件名FILE”。也就是說ls本身不帶任何參數(shù)就是列出當(dāng)前目錄加-a是加一個(gè)選項(xiàng)加-la是加兩個(gè)選項(xiàng)-l和-a可以合并后面再跟Documents就是只列出Documents這個(gè)目錄里的內(nèi)容。再看 DESCRIPTION描述里的一句話“List information about the FILEs (the current directory by default).” 列出 FILE 的信息若不指定 FILE則默認(rèn)列出當(dāng)前目錄。這就解釋了為什么你只敲ls就能看到當(dāng)前文件——因?yàn)椤爱?dāng)前目錄”是它的默認(rèn)動(dòng)作。這種“默認(rèn)行為 可選參數(shù)”的設(shè)計(jì)是 Linux 命令的通用邏輯掌握了它學(xué)其他命令就快得多。2.3 管文件和目錄ls,pwd,mkdir,rm是你的“數(shù)字抽屜管理員”我們用一個(gè)生活場景來串起這四個(gè)命令假設(shè)你要整理自己的學(xué)習(xí)資料需要一個(gè)叫os_lab的新文件夾把實(shí)驗(yàn)報(bào)告放進(jìn)去然后確認(rèn)它建好了、位置對不對、里面有沒有東西。第一步確認(rèn)你在哪pwdpwd輸出類似/home/yourname—— 這就是你的“家目錄”所有個(gè)人文件默認(rèn)存這里。pwd就是“Print Working Directory”打印你當(dāng)前站在哪個(gè)“數(shù)字抽屜”里。第二步建新抽屜mkdirmkdir os_lab這行命令會(huì)在當(dāng)前目錄也就是你家目錄下新建一個(gè)叫os_lab的空文件夾。注意mkdir默認(rèn)只能建一層目錄。如果你想建os_lab/experiment1/report這種多層結(jié)構(gòu)得加-p參數(shù)mkdir -p os_lab/experiment1/report。第三步看看抽屜里有啥lsls你應(yīng)該能看到剛建的os_lab文件夾。如果想確認(rèn)它確實(shí)是文件夾而不是同名文件加-F參數(shù)ls -F文件夾名后面會(huì)自動(dòng)加/比如os_lab/。第四步進(jìn)抽屜看看cd雖然沒在摘要里但必須提cd os_lab pwd # 再次確認(rèn)現(xiàn)在路徑變成了 /home/yourname/os_lab第五步刪錯(cuò)的抽屜rm和rmdir萬一建錯(cuò)了名字比如打成os_lba想刪掉它如果是空文件夾rmdir os_lba如果里面有文件或者你想一步到位刪文件夾和里面所有東西rm -r os_lba-r表示 recursive遞歸刪除極其重要rm是“永久刪除”沒有回收站所以rm -r一定要先ls確認(rèn)目標(biāo)再敲回車。注意ls -a顯示隱藏文件是因?yàn)?Linux 里以.開頭的文件如.bashrc默認(rèn)不顯示。它們不是“病毒文件”而是系統(tǒng)或軟件的配置文件控制著你的終端顏色、別名、啟動(dòng)腳本等。第一次看到ls -a列出一堆.開頭的文件別慌那是系統(tǒng)在悄悄幫你干活。3. 切換身份、掛載設(shè)備、編輯文件三個(gè)“跨域操作”讓你真正掌控系統(tǒng)權(quán)限和外部世界前一章講的是“看”和“管本地文件”這一章帶你邁出關(guān)鍵一步切換身份從普通用戶變成管理員、連接外部設(shè)備把 U 盤里的資料拿進(jìn)來、編輯文本寫第一個(gè) shell 腳本或 C 程序。這三件事共同構(gòu)成了 Linux 的“邊界感”——它明確區(qū)分“我的地盤”“系統(tǒng)地盤”“別人的東西”而你每次操作都在和這個(gè)邊界打交道。理解它們你就不再覺得 Linux 是“一堆命令”而是一個(gè)有規(guī)則、有邏輯、可預(yù)測的協(xié)作系統(tǒng)。3.1 切換身份sudo不是“開掛”而是“臨時(shí)借鑰匙”的安全協(xié)議實(shí)驗(yàn)總結(jié)里反復(fù)強(qiáng)調(diào)不要直接用 root 用戶登錄。為什么因?yàn)?root 就像一把萬能鑰匙能打開系統(tǒng)里每一扇門——包括/etc/passwd用戶數(shù)據(jù)庫、/boot啟動(dòng)文件、甚至/根目錄本身。一個(gè)手滑的rm -rf /雖然現(xiàn)代系統(tǒng)已加保護(hù)但類似誤操作仍可能癱瘓系統(tǒng)后果就是重裝系統(tǒng)。所以 Linux 設(shè)計(jì)了sudo它不給你鑰匙而是讓你“申請一次授權(quán)”辦完事鑰匙就收回。sudo mkdir /opt/myapp執(zhí)行這行系統(tǒng)會(huì)提示你輸入當(dāng)前用戶的密碼不是 root 密碼輸對后mkdir這條命令就以 root 權(quán)限運(yùn)行成功在/opt下建目錄。之后五分鐘內(nèi)你再敲任何sudo命令都不用輸密碼——這是sudo的“信任窗口”既省事又安全。提示sudo的核心原則是“最小權(quán)限”。比如你想裝軟件用sudo apt install vim但你想改自己家目錄下的.bashrc完全不需要sudo直接nano ~/.bashrc就行。濫用sudo就像用消防斧切水果——能切但沒必要還容易傷手。3.2 掛載 U 盤mount不是“插上就用”而是“告訴系統(tǒng)這塊硬盤請按這個(gè)規(guī)則解讀”U 盤插上電腦Linux 不會(huì)自動(dòng)把它變成D:盤。它先識(shí)別為一塊“裸設(shè)備”比如/dev/sdb然后你需要告訴系統(tǒng)“這塊設(shè)備上的第一個(gè)分區(qū)sdb1用 FAT32 文件系統(tǒng)格式存的數(shù)據(jù)請掛載到/mnt這個(gè)目錄下讓我能訪問”。這個(gè)“告訴”的過程就是mount。# 1. 先確認(rèn) U 盤設(shè)備名通常 sdb, sdc取決于你插了幾塊 lsblk # 2. 創(chuàng)建掛載點(diǎn)/mnt 是系統(tǒng)預(yù)設(shè)的臨時(shí)掛載目錄 sudo mkdir -p /mnt/usb # 3. 掛載指定設(shè)備、文件系統(tǒng)類型、掛載點(diǎn) sudo mount -t vfat /dev/sdb1 /mnt/usb # 4. 現(xiàn)在就可以訪問了 ls /mnt/usb這里-t vfat很關(guān)鍵它告訴系統(tǒng)“這塊盤用的是 Windows 兼容的 FAT32 格式”這樣讀寫才不會(huì)亂碼。如果你的 U 盤是 NTFS 格式就得換成-t ntfs如果是 Linux 原生的 ext4就用-t ext4。mount的本質(zhì)就是建立“設(shè)備 ? 文件系統(tǒng) ? 掛載點(diǎn)”三者的映射關(guān)系。卸載時(shí)用sudo umount /mnt/usb注意是umount不是unmount務(wù)必先卸載再拔 U 盤否則數(shù)據(jù)可能損壞。3.3 編輯文件vi/vim不是“難用的古董”而是“鍵盤即畫布”的高效文本工作流vi及其增強(qiáng)版vim是 Linux 終端里最主流的編輯器。新手怕它是因?yàn)樗小澳J健逼胀J揭苿?dòng)光標(biāo)、刪行、插入模式打字、命令模式保存、退出。但這恰恰是它的效率來源——不用鼠標(biāo)手指不離主鍵盤區(qū)就能完成所有操作。我們用一個(gè)真實(shí)例子寫一個(gè)最簡單的 shell 腳本讓它打印“Hello, OS Lab!”。# 1. 進(jìn)入 os_lab 目錄 cd ~/os_lab # 2. 用 vim 創(chuàng)建 hello.sh vim hello.sh此時(shí)進(jìn)入vim的普通模式光標(biāo)是方塊不能直接打字。按i鍵進(jìn)入插入模式輸入#!/bin/bash echo Hello, OS Lab!按Esc鍵退出插入模式回到普通模式。然后輸入:wq冒號(hào)小寫 wq回車——意思是“write and quit”保存并退出。搞定提示vim的入門口訣就三句i進(jìn)入編輯insertEsc回到命令command:wq保存退出write quit。其他都可后續(xù)學(xué)。別被網(wǎng)上那些“vim 快捷鍵大全”嚇住先用這三招一周后你就會(huì)發(fā)現(xiàn)vim比圖形編輯器快得多。4. 編譯運(yùn)行 C 程序從寫代碼到看見結(jié)果走通 Linux 編程界面的完整閉環(huán)很多新手學(xué) Linux卡在“寫了代碼卻不知道怎么讓它跑起來”。C 語言在 Linux 上的編譯運(yùn)行不是點(diǎn)一下“運(yùn)行”按鈕那么簡單而是一套清晰的四步流程寫edit→ 編譯compile→ 鏈接link→ 執(zhí)行execute。這四步就是 Linux 編程界面的核心骨架。理解它你才能明白為什么要有.c文件、.o文件、a.out以及gcc到底在后臺(tái)干了什么。4.1 寫代碼用 vim 創(chuàng)建一個(gè)標(biāo)準(zhǔn)的 C “Hello World”我們繼續(xù)在~/os_lab目錄下操作vim hello.c進(jìn)入vim按i輸入以下標(biāo)準(zhǔn) C 程序#include stdio.h int main() { printf(Hello, OS Lab from C!\n); return 0; }按Esc再輸入:wq保存退出。注意#include stdio.h是必須的它告訴編譯器“我要用printf這個(gè)函數(shù)它的定義在標(biāo)準(zhǔn)輸入輸出頭文件里”。漏掉這行編譯會(huì)報(bào)錯(cuò)undefined reference to printf——不是代碼錯(cuò)是“沒告訴編譯器去哪里找函數(shù)”。4.2 編譯gcc不是“一鍵生成”而是分階段工作的“流水線工人”gcc hello.c敲下回車沒報(bào)錯(cuò)也沒看到新文件等等——它其實(shí)默默生成了一個(gè)叫a.out的可執(zhí)行文件。gcc默認(rèn)行為就是把hello.c編譯、鏈接輸出到a.out。但為了更清楚每一步我們拆開來看# 1. 預(yù)處理展開 #include, #define gcc -E hello.c -o hello.i # 2. 編譯轉(zhuǎn)成匯編代碼 gcc -S hello.i -o hello.s # 3. 匯編轉(zhuǎn)成機(jī)器碼生成 .o 目標(biāo)文件 gcc -c hello.s -o hello.o # 4. 鏈接把 .o 和系統(tǒng)庫打包成可執(zhí)行文件 gcc hello.o -o hello最終你得到一個(gè)叫hello的可執(zhí)行文件不是a.out了。這四步就是完整的編譯流程。日常開發(fā)中我們直接用gcc hello.c -o hello一步到位但理解分步能幫你精準(zhǔn)定位問題比如預(yù)處理出錯(cuò)說明頭文件路徑不對鏈接出錯(cuò)說明函數(shù)名拼錯(cuò)了或沒加-lm數(shù)學(xué)庫。4.3 執(zhí)行./不是“多此一舉”而是 Linux 的安全沙箱機(jī)制編譯成功后你以為hello就能直接運(yùn)行試試hello # bash: hello: command not found報(bào)錯(cuò)了因?yàn)?Linux 默認(rèn)不把當(dāng)前目錄.加入命令搜索路徑$PATH。這是安全設(shè)計(jì)防止你無意中運(yùn)行了當(dāng)前目錄下同名的惡意程序比如有人放了個(gè)叫l(wèi)s的木馬。所以正確做法是./hello./的意思是“請?jiān)诋?dāng)前目錄dot slash下找這個(gè)叫hello的文件并執(zhí)行它”。這就是 Linux 的“顯式路徑”哲學(xué)——不做猜測只做你明確說的事。提示./是新手最容易忘的符號(hào)。記住口訣“編譯生成的可執(zhí)行文件運(yùn)行前必須加./”。它不是 bug是 feature。5. 常見問題排查新手必踩的 5 個(gè)坑現(xiàn)象、原因、解法全寫清楚剛上手 Linux不是代碼寫錯(cuò)而是環(huán)境、權(quán)限、路徑這些“看不見的墻”在擋路。下面這 5 個(gè)問題是我?guī)н^幾十個(gè)零基礎(chǔ)同學(xué)后統(tǒng)計(jì)出的最高頻“翻車現(xiàn)場”。每一條都按“你看到什么 → 為什么發(fā)生 → 怎么立刻解決”來寫照著做5 分鐘內(nèi)就能救活你的終端。5.1 現(xiàn)象sudo: command not found原因你的用戶沒被加入sudo用戶組或者系統(tǒng)壓根沒裝sudo極少見但某些精簡版系統(tǒng)會(huì)有。解決先確認(rèn)你是不是標(biāo)準(zhǔn)用戶whoami應(yīng)該輸出你的用戶名不是root然后切換到 root 用戶如果你知道 root 密碼su -輸入 root 密碼在 root 下執(zhí)行usermod -aG sudo your_username把your_username換成你自己的用戶名退出 rootexit重新登錄你的用戶或新開一個(gè)終端sudo就生效了。5.2 現(xiàn)象ls: cannot access xxx: No such file or directory原因你輸入的文件名或路徑有拼寫錯(cuò)誤或者大小寫錯(cuò)了Linux 區(qū)分大小寫Report.txt≠report.txt。解決先ls看當(dāng)前目錄下到底有什么用Tab鍵自動(dòng)補(bǔ)全輸入ls rep然后按Tab如果系統(tǒng)有report.txt它會(huì)自動(dòng)補(bǔ)成ls report.txt如果不確定路徑用絕對路徑ls /home/yourname/os_lab/避免相對路徑搞混。5.3 現(xiàn)象vim里按了i卻不能打字或者按Esc沒反應(yīng)原因vim有三種模式你可能卡在“命令模式”或“末行模式”但沒意識(shí)到。解決無腦按Esc三次確?;氐狡胀J皆侔磇應(yīng)該能進(jìn)入插入模式左下角出現(xiàn)-- INSERT --如果還是不行關(guān)掉重開CtrlC強(qiáng)制退出vim有時(shí)卡死再vim filename記住鐵律Esc是你的“安全鍵”任何時(shí)候按它都能回到可控狀態(tài)。5.4 現(xiàn)象gcc hello.c后./a.out報(bào)錯(cuò)Permission denied原因生成的a.out沒有“可執(zhí)行權(quán)限”。Linux 文件有 r讀、w寫、x執(zhí)行三類權(quán)限gcc默認(rèn)只給rw不給x。解決查看權(quán)限ls -l a.out輸出類似-rw-r--r-- 1 user user 12345 Jan 1 10:00 a.out注意開頭沒有x加執(zhí)行權(quán)限chmod x a.out再運(yùn)行./a.out。提示以后編譯時(shí)直接指定輸出名并加權(quán)限gcc hello.c -o hello chmod x hello一步到位。5.5 現(xiàn)象U 盤掛載后ls /mnt/usb顯示空或者中文文件名是亂碼原因掛載時(shí)沒指定正確的字符編碼codepage和 I/O 編碼iocharset。FAT32 U 盤在 Windows 下默認(rèn)用 GBK 編碼存中文Linux 默認(rèn)用 UTF-8不匹配就亂碼。解決卸載sudo umount /mnt/usb重新掛載指定編碼sudo mount -t vfat -o iocharsetutf8,codepage936 /dev/sdb1 /mnt/usb其中codepage936對應(yīng) GBKiocharsetutf8告訴 Linux 用 UTF-8 解釋。掛載后ls就能正常顯示中文了。6. 下一步學(xué)什么從“能跑通”到“真理解”一條平滑升級(jí)的學(xué)習(xí)路徑走到這一步你已經(jīng)能獨(dú)立完成實(shí)驗(yàn)報(bào)告里的所有基礎(chǔ)操作查系統(tǒng)、看幫助、管文件、切用戶、掛 U 盤、寫 vim、編譯 C、運(yùn)行腳本。但這只是起點(diǎn)。真正的 Linux 能力不在于你會(huì)多少命令而在于你能否把零散操作組織成解決實(shí)際問題的“自動(dòng)化流程”。下面這條路徑是我自己從“只會(huì)抄命令”到“能寫運(yùn)維腳本”的血淚經(jīng)驗(yàn)也是我?guī)氯藭r(shí)驗(yàn)證過最平滑的升級(jí)路線——不堆概念每一步都對應(yīng)一個(gè)你能立刻動(dòng)手的小項(xiàng)目。6.1 第一階段用 shell 腳本把重復(fù)操作“固化下來”13 天你現(xiàn)在手動(dòng)敲gcc hello.c -o hello chmod x hello ./hello三步。但如果每天要編譯 10 個(gè)文件呢這時(shí)候shell 腳本就是你的“快捷方式生成器”。動(dòng)手任務(wù)寫一個(gè)build.sh讓它自動(dòng)編譯當(dāng)前目錄下所有.c文件并運(yùn)行結(jié)果。#!/bin/bash # build.sh批量編譯并運(yùn)行當(dāng)前目錄的 C 程序 for file in *.c; do if [ -f $file ]; then echo 編譯 $file gcc $file -o ${file%.c} 2/dev/null if [ $? -eq 0 ]; then echo ? 編譯成功正在運(yùn)行... ./${file%.c} else echo ? 編譯失敗$file fi fi done保存為build.shchmod x build.sh然后./build.sh。它會(huì)遍歷所有.c文件挨個(gè)編譯、運(yùn)行。${file%.c}是 Bash 的參數(shù)擴(kuò)展自動(dòng)去掉.c后綴生成對應(yīng)可執(zhí)行名。這個(gè)小腳本就是你邁向自動(dòng)化編程的第一步。6.2 第二階段用make管理復(fù)雜項(xiàng)目的依賴關(guān)系35 天當(dāng)項(xiàng)目變大比如main.c依賴utils.c和utils.h改了utils.c你不想每次都手動(dòng)gcc main.c utils.c -o app。make就是為此而生的“智能構(gòu)建管家”。動(dòng)手任務(wù)為上面的hello.c寫一個(gè)Makefile# Makefile CC gcc CFLAGS -Wall -g hello: hello.o $(CC) $(CFLAGS) hello.o -o hello hello.o: hello.c $(CC) $(CFLAGS) -c hello.c -o hello.o clean: rm -f hello hello.o .PHONY: clean然后只需make自動(dòng)編譯、make clean清理make會(huì)根據(jù)文件修改時(shí)間只重新編譯被改動(dòng)的部分。這才是工程級(jí)的編譯管理。6.3 第三階段用gdb調(diào)試 C 程序看清代碼“怎么一步步跑的”57 天printf大法好但遇到段錯(cuò)誤Segmentation fault或邏輯錯(cuò)就得用調(diào)試器。gdb就是 C 程序的“慢動(dòng)作回放器”。動(dòng)手任務(wù)給hello.c加個(gè) bug然后用gdb定位#include stdio.h int main() { int *p NULL; // 故意讓指針為空 printf(Hello before crash\n); *p 10; // 這里會(huì)段錯(cuò)誤 printf(Hello after crash\n); return 0; }編譯時(shí)加-ggcc -g hello.c -o hello啟動(dòng)調(diào)試gdb ./hello在gdb里(gdb) run # 運(yùn)行會(huì)停在段錯(cuò)誤處 (gdb) bt # backtrace看調(diào)用棧 (gdb) list # 顯示出錯(cuò)附近的源碼 (gdb) print p # 打印指針值確認(rèn)是 NULL你立刻就知道*p 10這一行試圖往空地址寫數(shù)據(jù)所以崩了。這才是真正的“看見問題”。6.4 第四階段理解進(jìn)程與信號(hào)寫出能響應(yīng) CtrlC 的程序710 天Linux 里CtrlC不是“關(guān)閉程序”而是發(fā)送SIGINT信號(hào)。一個(gè)健壯的程序應(yīng)該能捕獲它做清理再退出而不是直接崩掉。動(dòng)手任務(wù)改寫hello.c讓它收到CtrlC時(shí)優(yōu)雅退出#include stdio.h #include signal.h #include stdlib.h void handle_sigint(int sig) { printf(\n 收到 CtrlC正在退出...\n); exit(0); } int main() { signal(SIGINT, handle_sigint); // 注冊信號(hào)處理器 printf(程序運(yùn)行中按 CtrlC 退出...\n); while(1) { sleep(1); // 每秒循環(huán)一次避免占滿 CPU } return 0; }編譯運(yùn)行后按CtrlC它會(huì)打印告別語再退出。你第一次親手“攔截”了系統(tǒng)信號(hào)這就是系統(tǒng)編程的入口。從那以后我每次寫 C 程序只要涉及循環(huán)或等待都會(huì)習(xí)慣性加上signal()處理SIGINT和SIGTERM每次寫腳本第一行必是#!/bin/bash第二行必是set -e出錯(cuò)立即停止每次gcc必加-Wall -g。這些不是教條而是無數(shù)個(gè)Segmentation fault和Permission denied教會(huì)我的肌肉記憶。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取