1. 在Linux下實(shí)現(xiàn)進(jìn)度條程序。 通過makefile進(jìn)行編譯。 建議自主完成一個(gè)彩色的進(jìn)度條。
寫Makefile文件的原因:Makefile文件的作用是命令行編譯鏈接命令nmake使用的文件。它以人本方式規(guī)定了make要編譯哪些文件,生成哪些文件,要鏈接哪些文件,生成的.exe文件的名稱等。
思路:
1. 進(jìn)度條由0%-100%,在字符數(shù)組中輸出一串字符時(shí),最后以”\0”結(jié)束的,所以需要一個(gè)大小為102的數(shù)組,加載橙紅的數(shù)據(jù)用”=”表示。
2. 進(jìn)度條會(huì)出現(xiàn)一個(gè)區(qū)間,然后在里面進(jìn)行加載,故先用”[“”]”表示加載的區(qū)間。
3. 定義一個(gè)rate標(biāo)識(shí)進(jìn)度。沒進(jìn)行一次加一,直到100停止
4. 在進(jìn)行回車前,需要進(jìn)行刷新
5. 在加載進(jìn)度時(shí),通過sleep()&usleep()控制睡眠時(shí)間,sleep表示秒,usleep表示微妙。
6. 對(duì)于加載中旋轉(zhuǎn)的小圈通過”-|/”順時(shí)針進(jìn)行。
主要代碼如下
#include #include int main() { int rate =0; char str[102]={0}; char * sta=“-\|/”; while(rate《=100) { str[rate]=“-”; printf(“[%-100s],%d%%,[%c]\r”,str,rate,sta[rate%4]); rate++; ffush(stdout); usleep(100000); } retunr 0; }
Linux下程序編寫完成之后,在進(jìn)行編譯鏈接生成可執(zhí)行文件
方式1 gcc test.c -o test
。/a.out
方式2 編譯makefile文件
test:test。o gcc -o test -o test.o test.o:test.s gcc -C test.i -o test.o test.s:test.i gcc -S test.i -p test.i test.i:test.c gcc -E test.c -o test.i .PHONY:clean clean: rm -f test.o rm -f test.s rm -f test.i rm -f test 1.回車(\r)和換行(\n)
回車和換行是兩個(gè)不同的概念,回車:表示回到當(dāng)前行的行首。換行:表示光標(biāo)進(jìn)入當(dāng)前行的下一行
在Linux中,\n會(huì)進(jìn)行回車+換行操作,而/r不會(huì)進(jìn)行回車操作,只會(huì)被當(dāng)做控制字符處理。
在Windows下,每行的結(jié)尾是《\n》《\r》;在Linux下,每行的結(jié)尾是《\n》。所以,Linux下打開Windows的文件,每行會(huì)多出一個(gè)^M符號(hào);而在Windows下打開Linux文件,所有的內(nèi)容變成一行。
2.緩沖區(qū)
####(1)什么是緩沖區(qū)?
緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分,在內(nèi)存空間中預(yù)留了一定的存儲(chǔ)空間,這些空間用來緩沖輸入或輸出的書庫,這部分預(yù)留的空間就叫做緩沖區(qū)。
緩沖區(qū)根據(jù)其對(duì)應(yīng)的是輸入涉筆還是輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。
(2)為什么要引入緩沖區(qū)
比如我們從磁盤里取信息,我們先把讀出的數(shù)據(jù)放在緩沖區(qū),計(jì)算機(jī)再直接從緩沖區(qū)中取數(shù)據(jù),等緩沖區(qū)的數(shù)據(jù)取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數(shù),再加上計(jì)算機(jī)對(duì)緩沖區(qū)的操作大大快于對(duì)磁盤的操作,故應(yīng)用緩沖區(qū)可大大提高計(jì)算機(jī)的運(yùn)行速度。
又比如,我們使用打印機(jī)打印文檔,由于打印機(jī)的打印速度相對(duì)較慢,我們先把文檔輸出到打印機(jī)相應(yīng)的緩沖區(qū),打印機(jī)再自行逐步打印,這時(shí)我們的CPU可以處理別的事情。
現(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。
(3)緩沖區(qū)的類型
緩沖區(qū) 分為三種類型:全緩沖、行緩沖和不帶緩沖。
a、全緩沖
在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。全緩沖的典型代表是對(duì)磁盤文件的讀寫。
b、行緩沖
在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),執(zhí)行真正的I/O操作。這時(shí),我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的I/O操作。典型代表是鍵盤輸入數(shù)據(jù)。
c、不帶緩沖
也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯(cuò)情況stderr是典型代表,這使得出錯(cuò)信息可以直接盡快地顯示出來。
(4)緩沖區(qū)的刷新 下列情況會(huì)引發(fā)緩沖區(qū)的刷新: 1、緩沖區(qū)滿時(shí); 2、執(zhí)行flush語句; 3、執(zhí)行endl語句; 4、關(guān)閉文件。 可見,緩沖區(qū)滿或關(guān)閉文件時(shí)都會(huì)刷新緩沖區(qū),進(jìn)行真正的I/O操作。另外,在C++中,我們可以使用flush函數(shù)來刷新緩沖區(qū)(執(zhí)行I/O操作并清空緩沖區(qū)),如:cout《Linux下呢,有一個(gè)萬能的“男人”,我們有什么不懂得,就可以去問這個(gè)“男人”,它就是man指令。下面我們以查詢fflush()函數(shù)的頭文件來使用man命令查詢,輸入man fflush后按回車鍵,就會(huì)出現(xiàn)一個(gè)查詢文檔。
2.Linux下軟件安裝的幾種方式
rpm安裝的常用選項(xiàng)
操作符 作用
rpm -ivh full_pkgname 安裝
rpm -e pkgame 卸載
rpm -qa[pkgame] 列出所有已經(jīng)安裝過的包
rpm -ql pkgame 列出一個(gè)已經(jīng)安裝的包安裝了哪些文件
rpm -qf file 列出某個(gè)文件由哪幾個(gè)包安裝
rpm -qi file 查詢某個(gè)安裝包的詳細(xì)信息
rpm -nodeps 強(qiáng)制安裝,不用管其他依賴的包
rpm -force 強(qiáng)制安裝,而不管系統(tǒng)中有沒有安裝過這個(gè)包
yum安裝
- yum工具是RedHat公司開發(fā)的用于管理rpm包的工具
- 使用yum安裝rpm包可以自動(dòng)解決包之間的依賴關(guān)系
- 我們可以自定義yum的源,可以搭建本地yum倉庫
- yum源配置文件為/etc/yum.repos.d/CentOS-Base.repo
操作符 作用
yum install pkg 安裝rpm包
yum remove pkg 卸載rpm包
yum list 從配置文件中指定的yum源列出所有的rpm安裝包
yum search xxx 搜索rpm包
yum groupinstall grp 安裝rpm組件
yum groupremove grp 卸載rpm組件
yum grouplist 列出所有的rpm組件
yum update/yum upgrade 更新所有的rpm包
搭建本地yum庫
1. 將centos安裝盤或安裝鏡像掛載到指定路徑mnt/
2. 備份好配置文件 /etc/yum.repos.d/CentOS-Base.repo到一個(gè)指定路徑
3. 刪除配置文件 /etc/yum.repos.d/CentOS-Base.repo
4. 編輯另一個(gè)配置文件 /etc/yum.repos.d/CentOS-Media.repo
[local-cdrom] —-》 yum list 時(shí)顯示在最右邊的標(biāo)識(shí);
name=cd —-》 yum 倉庫標(biāo)識(shí);
baseurl=file:///mnt/ —-》 指定 rpm 倉庫路徑;
gpgcheck=0 —-》 不檢測;
enabled=1 —-》 允許 ;
5. 保存退出
使用yum只下載不安裝rpm包
1. 先安裝一個(gè)插件:yum install -y yum-plugin-downloadonly;
2. 對(duì)于未安裝過的 rpm 包:yum install -y pkg –downloadonly;
3. 對(duì)于已經(jīng)安裝過的:yum reinstall -y pkg –downloadonly;
4. 指定 rpm 包的下載路徑:yum install -y pkg –downloadonly –downloaddir dir.
源碼安裝
1. 下載源碼包盡量從官網(wǎng)下載,保證安全
2. 源碼包保存路徑約定為:/usr/local/src/
3. 安裝路徑約定為:/usr/local/源碼包名
4. 安裝開始前,先要查看安裝說明 vim INSTALL vim README
5. 查看配置參數(shù):。/configure –help
6. 安裝過程中,每進(jìn)行完一步要使用echo $? 進(jìn)行驗(yàn)證前一步是否產(chǎn)生錯(cuò)誤
操作符 作用
。/configure –help 查看所有配置參數(shù)及含義
。/configure … 配置安裝路徑、安裝模塊
make 編譯
make install 安裝
echo $! 檢查上一步安裝是否出錯(cuò),‘0’:正確;‘1’:錯(cuò)誤
調(diào)研task_struct結(jié)構(gòu)體, 理解結(jié)構(gòu)體中的各個(gè)字段的含義
Linux內(nèi)核通過一個(gè)被稱為進(jìn)程描述符的task_struct結(jié)構(gòu)體來管理進(jìn)程,
task_struct是Linux中的【進(jìn)程控制塊PCB結(jié)構(gòu)】的具體數(shù)據(jù)結(jié)構(gòu)
這個(gè)結(jié)構(gòu)體包含了一個(gè)進(jìn)程所需的所有信息。它定義在linux-2.6.38.8/include/linux/sched.h文件中。
下面對(duì)task_struct這個(gè)結(jié)構(gòu)體 進(jìn)行各個(gè)字段的詳細(xì)介紹
1. 調(diào)度數(shù)據(jù)成員 (1) volatile long states;
表示進(jìn)程的當(dāng)前狀態(tài):
- TASK_RUNNING:正在運(yùn)行或在就緒隊(duì)列run-queue中準(zhǔn)備運(yùn)行的進(jìn)程,實(shí)際參與進(jìn)程調(diào)度。
- TASK_INTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,也可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒后進(jìn)入就緒隊(duì)列run-queue。
- TASK_UNINTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,不可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒。
- TASK_ZOMBIE:表示進(jìn)程結(jié)束但尚未消亡的一種狀態(tài)(僵死狀態(tài))。此時(shí),進(jìn)程已經(jīng)結(jié)束運(yùn)行且釋放大部分資源,但尚未釋放進(jìn)程控制塊。
- TASK_STOPPED:進(jìn)程被暫停,通過其它進(jìn)程的信號(hào)才能喚醒。導(dǎo)致這種狀態(tài)的原因有二,或者是對(duì)收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信號(hào)的反應(yīng),或者是受其它進(jìn)程的ptrace系統(tǒng)調(diào)用的控制而暫時(shí)將CPU交給控制進(jìn)程。
- TASK_SWAPPING: 進(jìn)程頁面被交換出內(nèi)存的進(jìn)程。
(2) unsigned long flags;
評(píng)論
查看更多