《Linux程序設計》各章知識點梳理
第1章
-
軟件包的管理方式方面,Ubuntu、CentOS的差異
Ubantu使用APT,CentOS使用YUM -
如何添加一個新用戶?
Useradd new_user_name -
什么是Shell?
Shell 是一個用 C 語言編寫的程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。 -
如何查看一條命令的幫助文檔?
man 命令 -
ls命令的各種選項
-
-l(長格式):以長格式列出信息,包括文件權限、所有者、大小和最后修改時間。
ls -l -
-a(所有文件):顯示所有文件和目錄,包括以點(.)開頭的隱藏文件。
ls -a -
-h(易讀格式):與 -l 結合使用時,以易讀的格式顯示文件大小(例如,以 K、M 或 G 顯示)。
ls -lh -
-t:按修改時間排序,通常與 -l 結合使用。
ls -lt -
-d:僅顯示目錄本身的信息,而不是目錄內容。
ls -d mydir -
-p:在每個文件或目錄名后添加一個斜杠(/),以區分文件和目錄。
ls -p -
-i:顯示文件的 inode 號。
ls -i -
建立、復制、刪除目錄
建立:mkdir
復制:cp -r src dst
刪除:rm -r(通用)、rmdir(刪除空目錄) -
cd命令,如何進入特定的目錄,例如主目錄、上一層目錄等?
進入主目錄:Cd ~
進入上一層:cd … -
chmod命令,修改權限
chmod 777 -
grep與正則表達式
頭,$尾,[a-z],[a-z]非 -
sort命令
? sort filename.txt
將 filename.txt 文件中的行輸出到標準輸出,按字典序排序。 -
wc命令,管道的使用
wc -l 統計行數
wc -c 統計字節
wc -m 統計字符
wc -w 統計單詞
管道:| -
pwd與PWD
pwd 是一個命令,顯示當前目錄
PWD 是環境變量,顯示的也是當前目錄的完整路徑 -
各種壓縮命令,特別是tar命令
? 文件歸檔
tar [cx][zj][v]f filename [filelist]
? c: 創建歸檔
? x:展開歸檔
? z:調用gzip對歸檔壓縮/解壓
? j:調用bzip2對歸檔壓縮/解壓
? v:顯示冗余信息 -
find命令
? find — 文件搜索
find [目錄] [選項] [動作]
? -name 按名稱查找,可以使用通配符,但必須使用引號括起來
? -type 按類型查找
? -exec 將查找到的目標進行進一步處理,exec后跟隨處理命令,命令中通過 {} 引用被找的文件,而且命令必須以 “ ;”結束 -
mv命令,移動與改名
移動到不存在的文件就是改名 -
ln 與 ln -s,符號鏈接文件與硬鏈接文件的區別?
符號鏈接(ln -s):是一種獨立的文件,創建時源文件可以不存在,可以跨文件
名稱 命令 類型 源文件 跨文件系統 備注
符號鏈接 ln -s 獨立文件 可以不存在 可以
硬鏈接 ln 與源文件共享一個inode 必須存在 不可以 不能給目錄創建硬鏈接 -
head tail cat more
? more 命令用于分頁查看文件內容。它一次顯示一頁內容,你可以按回車鍵查看下一頁,或使用空格鍵查看下一頁的下一行。
? less 命令是一個更強大的 more 命令版本,它允許你前后翻頁,并且可以搜索文本。less 也可以用來查看壓縮文件和管道輸出。
? head 命令用于顯示文件的開始部分,默認情況下顯示前 10 行。
? tail 命令用于顯示文件的末尾部分,默認情況下顯示最后 10 行。 -
bc計算,與echo命令搭配,如何做計算?如何做小數或浮點數的運算?
qiao@qiao-virtual-machine:~/workspace$ echo “scale=3; (12.3 + 4.56) * 7.8” | bc
131.508 -
ps -l命令、ps -ef命令
? 查看進程—ps
ps [-lauxwm]
? l:以長列表形式顯示
? w:以加寬格式顯示
? a:顯示所有用戶進程
? u:按用戶名和啟動時間的順序顯示進程
? x:顯示無控制臺進程
? ef:全部進程+完整信息
常用組合:-aux 顯示所有進程
? 進程監控—top -
who、free
who:顯示當前在線用戶
free:顯示內存信息 -
kill命令及kill函數(C語言)
命令:kill -SIGKILL PID
C語言:int kill(pid_t pid, int sig); -
大寫的PWD、PATH、HOME、USER分別表示什么含義?
? PWD:當前工作目錄路徑
? PATH:命令執行路徑
? HOME:用戶主目錄
? USER:用戶登錄名 -
Shell元字符*、?、[]、{}、~的使用方法
-
重定向> >> < ,命令的后臺執行、順序執行分別用什么?
: 輸出重定向,會清空文件內容
輸出重定向,不會清空文件內容
< 輸入重定向
后臺執行:&
順序執行:管道,分號隔開
-
vim有哪幾種工作模式?命令模式、末行模式的各種基本操作
三種:輸入模式,上述兩種
命令模式:dd刪除、p粘貼、yy復制
末行模式:wq保存退出、q不保存退出、q!強制退出 -
Linux文件系統中,有一些默認的目錄,例如/etc、/dev等,它們分別存放什么文件?
/etc: 存放配置文件
/dev: 存放設備文件 -
/etc/passwd是什么文件?文件的內容有哪些?
存放用戶信息 -
如何利用管道將多個命令連接起來完成一個指定的任務,例如“統計所有普通文件所含有的字符數”、“統計所有普通文件的個數”
cat file_name | wc -m
find -type f | wc -l
第2章 -
bash腳本的第一行
幻數,內核程序用以標識這是腳本程序 -
shell腳本中,$0 $1 $2 $# $* $?的含義
變量名 含義
$? 最后一次執行命令的返回碼
$$ 當前腳本自己的PID
$# 命令行參數的個數
$0 腳本文件本身的名字
$1, 2 … 第一、第二個命令行參數“ 2… 第一、第二個命令行參數 “ 2…第一、第二個命令行參數“*” 將所有命令行參數作為一個整體單詞看待
“$@” 將命令行參數作為多個單詞看待 -
Shell編程例題
#!/bin/bash 幻數
echo -n enter filename: 不輸出換行符,打印enter filename
read fname 讀入文件名存入fname
echo -n enter words:
read words
echo w o r d s 2 > / d e v / n u l l > words 2>/dev/null > words2>/dev/null>fname輸出剛讀入的words,不輸出錯誤信息,將words內容重定向到fname
if [ $? –eq 0 ]如果上一條echo命令的返回碼為0(也就是成功執行)
then
echo Write successfully
else
echo write error
fi -
知道()、{}、[]、[[]]、
(())的使用方法 ? () 子shell中執行 ? 如果是arr=(1,2,3),那就是數組賦值 ? {} 本shell中執行、聲明數組、{1..4}生成1-4 ? 上述兩個都可以成組命令,使用 && 、|| ? [] 測試條件 ? [[]] 更復雜的條件測試,可以對于字符串操作、算數比較 ?
命令替換
? (()) 執行算術運算 -
echo “ i ”與 e c h o ‘ i” 與 echo ‘ i”與echo‘i’的執行結果的區別
“” 會替換i變量的值,’’ 不會 -
read命令,read $xyz是否正確?
錯誤,read讀入的應該是變量,而不是環境變量 -
牢固掌握if語句的用法
-
shell下如何做字符串拼接?
echo “$word1 $word2” -
如何判斷一個變量是文件還是目錄,-e -s的含義
? -f 普通文件 、-d 目錄
? -s 文件大小非零
? -r 可讀 -w 可寫 -x 可執行
? -L/h 符號鏈接文件 -
字符串、表達式的比較
-
for循環,for循環的C語言風格寫法
-
while循環,無限循環,怎么寫?
-
case語句
-
break
-
continue
-
數組,a=(one two three four)是什么含義?如何輸出數組的每個元素?如何獲取數組的元素個數?
echo ${a[@]}
echo “數組元素個數為: ${#my_array[@]}” -
斐波那契數列的構造及其求和。
注:下列內容中,系統調用與函數在說法上沒有加以區分。
第3章
-
gcc -c的含義
-
gcc編譯過程包括哪些步驟,其中的鏈接步驟指的是什么?
? 預處理(-E,*.i):宏替換
? 編譯(-S, *.s):C語言轉為匯編代碼
? 匯編(-c, *.o):匯編代碼轉為機器代碼
? 鏈接(gcc):將機器代碼和庫文件鏈接 -
靜態庫與共享庫的不同之處是什么?
靜態庫:鏈接時,庫成為代碼的一部分
共享庫:運行時將庫引用插入,庫的代碼不復制,需要用到時,操作系統加載 -
make命令的功能、好處?makefile、Makefile的作用,基本結構?
功能:自動化編譯、
好處: 節省時間
結構:
目標文件:依賴文件
命令
第4章 -
時間函數(asctime、localtime、time)的使用方法
? time_t time(time_t *t) 系統調用,返回自1970.1.1午夜以來流失的秒數。
? struct tm * localtime(const time_t * t)
? char * asctime(const struct tm *tp) 和 char * ctime(const time_t * t) 都是將指定時間轉換為字符形式的時間,長度大概26個字母。 -
tm結構的基本屬性
tm_mday tm_mon -
如何在C語言中輸出當前的時間?(不使用system或exec函數族)
-
什么是用戶空間、什么是內核空間?
? 系統調用在內核空間,是系統內核的所在區域
? 庫函數調用在用戶空間,是普通程序的內存區域 -
getenv函數與env命令
都是獲取環境變量
第5章 -
什么是系統調用、什么是函數?
系統調用:是面向硬件的調用,無緩沖區
函數:是程序的api -
chmod函數
-
umask函數的作用、umask命令的使用方法
mode_t umask(mode_t cmask)
修改當前進程環境的權限掩碼為 cmask:八進制值
返回修改之前的掩碼。 -
stat結構體與stat函數、stat命令的聯系、各自的功能。
Stat:描述文件其他屬性。
int stat(const char *path, struct stat *buf) 獲取指定文件文件的屬性信息,并填充到buf。 -
如何根據stat結構體獲得文件的類型、權限等信息?
先創建一個struct stat結構體,然后使用stat()函數,通過路徑,傳到stat結構體中。 -
文件描述符與文件指針的區別,各自的應用環境
文件描述符(File Descriptor):是一個代表打開文件的整數,由操作系統分配。它用于在系統調用中引用文件。
文件指針(File Pointer):是一個指向文件當前讀取或寫入位置的指針。它由程序內部維護,用于順序訪問。 -
open、close、read、write要非常熟悉。讀文件、讀鍵盤、輸出到屏幕、輸出到文件操作要熟悉。
open(path,flags):從path按照flags模式打開文件
close()
read(fd, buf, count):從fd中讀取count字節到buf
write():寫入buf -
open文件時如果采用O_NONBLOCK方式,則后續的效果是怎么樣的?
非阻塞:如果打開不成功,立即返回 -
open文件時,O_TRUNC、O_WRONLY是什么方式?
清空、只讀 -
如何利用C語言實現文件的復制?如何編寫屬于自己的命令程序,mycp ?
? 先用open打開兩個文件給予相應權限,一個read循環,在這個循環中進行write
? 將可執行文件添加到$PATH后面
? -
opendir、readdir、closedir是用來做什么的?
打開目錄
經常使用opendir獲得一個目錄,然后使用readdir進行while循環,其間使用structdirent* entry 進行讀取名稱,如果想獲得其他屬性,需要使用struct stat file_stat進行讀取(一定不是指針),最后使用closedir -
如何將指定目錄下的文件或目錄的詳細信息(名稱、類型、大小、修改時間等)列舉出來?
同11
第6章 -
進程的基本概念
進程是運行的程序,是動態的,是操作系統分配和調度資源的基本單位 -
如何獲得進程的PID、PPID?
Getpid()
Getppid()
unistd.h -
熟練掌握fork函數的用法
=0為子進程,>0為父進程,<0為出錯 -
父子進程如何交替執行?
Wait()、sleep() -
什么是僵尸進程、什么是孤兒進程,由誰來回收?
僵尸進程:一個進程已經終止,但是父進程未對其PCB進行釋放
孤兒進程:使用fork創建的子進程,父進程先于子進程銷毀,由init/systemd回收 -
sleep函數的作用?
掛起進程,秒 -
如何避免僵尸進程,wait函數、waitpid函數的多種用法
避免:在父進程中使用 wait() 或 waitpid() 函數來回收子進程的狀態信息。 -
如何產生多個進程,而不發生僵尸進程,進程號之間彼此有什么關聯?
For循環產生,但是每個父進程都使用wait()等待子進程。
子進程的ps中可以找到父進程pid -
WIFEXITED、WEXITSTATUS兩個宏是用來做什么的?
1->是否正常退出
2->正常退出的返回值 -
什么是SIGCHILD信號,有什么作用?
SIGCHILD 信號是當一個子進程結束時,操作系統發送給父進程的信號。 -
父進程如何給其子進程發送信號,通過什么函數?kill函數與raise函數的區別是什么?
通過kill。
? 區別:
? Kill可以發給任何程序,只要權限夠
? Raise信號發給自己 -
守護進程的特點是什么?如何產生一個守護進程?產生守護進程的每個步驟的作用分別是什么?
? 特點:
? 長期運行在后臺
? 周期性執行任務
? 產生 & 作用:
? 創建子進程,終止父進程:子進程就是守護進程
? 在子進程中創建新會話:確保守護進程不附屬于任何會話,不擁有終端
? 改變到安全的工作目錄:防止目錄被刪除
? 重設工作掩碼:確保守護進程創建的文件有合適的權限
? 關閉文件描述符:防止守護進程對終端的輸出,以及避免文件描述符泄露,確保守護進程不會對用戶的文件系統造成影響。 -
什么是進程組、什么是會話組?
會話是一組進程的高級集合,會話中的進程共享一個會話 ID(SID)。 -
守護進程是孤兒進程嗎?
不是
? 守護進程不會被回收
? 也有父進程(init進程) -
如何編寫簡單的守護進程?例如周期性地向指定文件中寫入當前的最新時間、如何監督檢查指定文件是否被修改過?
-
system函數與exec函數族的使用方法,區別
-
exec函數族中execl、execv在使用時,參數方面有何區別?
? exec函數族格式
? char *const ps_argv[] ={“ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL};
? char *const ps_envp[] ={“PATH=/bin:/usr/bin”, “TERM=console”, NULL};
? execl(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
? execv(“/bin/ps”, ps_argv);
? execle(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL, ps_envp)
? execve(“/bin/ps”, ps_argv, ps_envp);
? execlp(“ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
? execvp(“ps”, ps_argv);
第7章
-
進程間通信的幾種方式是什么?
管道、System V IPC和套接字 -
用戶進程對于信號響應的方式有哪些?如何編程實現?
-
alarm函數
int alarm(int second)
設定一個定時器,在指定秒數后向進程自身發送一個SIGALRM信號,該信號默認處理是終止當前進程。 -
signal函數的用法
先定義signal_handler,進行信號處理;再使用signal(發生信號,處理函數)進行注冊,然后使用。 -
當前進程如何在收到某一特定的信號(例如SIGINT)后,不執行默認的操作,轉而執行自定義的操作?
自定義操作函數,傳入signal 的第二個參數 -
SIGKILL與SIGSTOP的特殊性在哪里?SIGINT、SIGQUIT、SIGTERM的共同點是什么?
SIGKILL 的特殊性
? 不可捕捉:SIGKILL(信號編號 9)是一個強制殺死進程的信號,進程不能捕捉或忽略它。
? 立即終止:接收到 SIGKILL 的進程將立即終止,不會執行任何清理操作。
? 系統使用:通常由操作系統或 root 用戶用來終止那些不響應其他信號的進程。
SIGSTOP 的特殊性
? 不可忽略:SIGSTOP(信號編號 19)用于暫停進程的執行,進程不能捕捉或忽略它。
? 停止進程:進程接收到 SIGSTOP 后將停止運行,直到接收到 SIGCONT 信號恢復執行。
? 單向通信:SIGSTOP 只能由發送者控制,接收進程無法控制何時恢復。
SIGINT、SIGQUIT、SIGTERM 的共同點
? 可捕捉:這些信號都可以被進程捕捉,進程可以定義自己的信號處理函數來響應這些信號。
? 終止進程:它們的默認行為都是終止進程,但允許進程通過捕捉信號來執行清理操作。
? 用戶生成:這些信號通常由用戶生成,例如 SIGINT 可以通過 Ctrl+C 生成,SIGQUIT 可以通過 Ctrl+\ 生成。
? 默認行為:它們的默認行為是終止進程,但進程可以通過捕捉信號并執行特定的清理操作來改變這一行為。
SIGINT
? 中斷信號:通常與 Ctrl+C 關聯,用于請求進程終止。
SIGQUIT
? 退出信號:通常與 Ctrl+\ 關聯,用于請求進程終止并生成核心轉儲(core dump),用于調試。
SIGTERM
? 終止信號:是一個通用的終止信號,用于請求進程正常終止并執行清理操作。 -
什么是管道?什么是匿名管道、什么是命名管道,各自的應用場景是什么?
? 管道是Unix最早支持的IPC形式。
? 匿名管道:只能在親緣進程之間通信
? 命名管道:借助于外存解除普通管道只能在同源進程使用的限制 -
如何利用pipe系統調用實現父子進程的管道通信?
? 父進程關閉讀端,fd[0],使用write向fd[1]中寫
? 子進程關閉寫端,fd[1],使用read從fd[0]讀 -
如何利用匿名管道讓父進程寫文件、子進程讀文件?如何使用dup2函數讓操作變得更簡單?
? 父進程關閉讀端,fd[0],利用dup2(fd[0], 0)將管道寫端和標準輸出流連接
? 子進程關閉寫端,fd[1],利用dup2(fd[1], 1)將管道讀端和標準輸入流連接 -
命名管道文件的類型是以什么開頭的?
/dev/