




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1講Linux系統(tǒng)文件操作本章概述本章的學(xué)習(xí)目標(biāo)主要內(nèi)容本章概述
本章主要介紹Linux系統(tǒng)基本知識(shí),包括Linux系統(tǒng)簡(jiǎn)介、文件系統(tǒng)目錄結(jié)構(gòu)、文件類型、文件權(quán)限、Linux命令格式,以及文件目錄的基本操作,為在Linux環(huán)境下進(jìn)行編程設(shè)計(jì)打下基礎(chǔ)。本章的學(xué)習(xí)目標(biāo)了解UNIX與Linux系統(tǒng)的基本特點(diǎn)和發(fā)展歷程理解Linux系統(tǒng)目錄結(jié)構(gòu)掌握Linux系統(tǒng)安裝、啟動(dòng)、登錄方法掌握Linux文件屬性和權(quán)限掌握Linux文件路徑概念和通配符含義掌握常用Linux文件與目錄的操作命令使用掌握Linux文件打包解包方法理解I/O重定向和管道功能和基本概念主要內(nèi)容Linux/Unix系統(tǒng)簡(jiǎn)介L(zhǎng)inux目錄結(jié)構(gòu)Linux系統(tǒng)用戶界面、命令格式Linux文件與命令操作輸入輸出重定向和管道1.1UNIX/Linux系統(tǒng)簡(jiǎn)介(一)UNIX系統(tǒng)簡(jiǎn)介1.什么是UNIX系統(tǒng)是一種多用戶、多任務(wù)、多層次的操作系統(tǒng),廣泛用于金融、教育、科研、軍事領(lǐng)域,用于運(yùn)行核心業(yè)務(wù),管理企業(yè)關(guān)鍵數(shù)據(jù)資料、信息與Windows系列系統(tǒng)相比,具有安全性高、可靠性強(qiáng)、性能高優(yōu)點(diǎn),可以一年365天、7×24小時(shí)不停機(jī)運(yùn)行UNIX系統(tǒng)凝聚了一大批天才計(jì)算機(jī)科學(xué)家和程序員的智慧,結(jié)構(gòu)清晰、功能強(qiáng)大、技術(shù)先進(jìn),是大學(xué)師生研究、學(xué)習(xí)操作系統(tǒng)原理、計(jì)算機(jī)系統(tǒng)工作原理首選的實(shí)例系統(tǒng)2.UNIX系統(tǒng)誕生1969年,由BellLabs(貝爾實(shí)驗(yàn)室)KenThompson和DennisRitchie處于興趣開(kāi)發(fā)而成,1971年完成版本11973年,DennisRitchie創(chuàng)造了C語(yǔ)言,與KenThompson一起用C語(yǔ)重寫(xiě)了Unix的第三版內(nèi)核,使維護(hù)和移植變得便利同時(shí)授權(quán)給科研機(jī)構(gòu)與企業(yè)進(jìn)一步發(fā)展,逐漸形成兩個(gè)版本線:加州大學(xué)Berkeley分校,1978年發(fā)展了研究版本BSDUNIXAT&T,1983年開(kāi)發(fā)商業(yè)版本SystemV版本4(SVR4),在此基礎(chǔ)上早就了IBMAIX和HPUX兩個(gè)發(fā)現(xiàn)版本3.UNIX主要版本AIX:是IBM基于SVR4開(kāi)發(fā)的一套UNIX操作系統(tǒng),性能高、安全、可靠性高,廣泛用于金融領(lǐng)域。Solaris:SunMicrosystems1982年推出基于BSDUnix的SunOS,以后在接口上向SVR4靠攏,新版本稱為Solaris,性能高、處理能力強(qiáng),在高校、科研院所用得多HP-UX:是惠普公司以SVR4為基礎(chǔ)所研發(fā)成的類UNIX操作系統(tǒng)。IRIX:是SGI公司以SVR4與BSD延伸程序?yàn)榛A(chǔ)所發(fā)展成的UNIX操作系統(tǒng),具有很強(qiáng)的圖形處理功能,在游戲設(shè)計(jì)中廣泛使用的三維圖形庫(kù)編程openGL從此而來(lái)。4.UNIX系統(tǒng)存在的問(wèn)題Unix的不同版本間不兼容,給應(yīng)用開(kāi)發(fā)帶來(lái)極大負(fù)擔(dān)搭建Unix系統(tǒng)的費(fèi)用非常昂貴。主機(jī)、UNIX系統(tǒng)、開(kāi)發(fā)工具、應(yīng)用軟件需分別購(gòu)買Unix系統(tǒng)源碼不開(kāi)放,購(gòu)買要錢,給學(xué)習(xí)、研究帶來(lái)不便(二)Linux系統(tǒng)概述1.什么是Linux?Linux是一種類UNIX操作系統(tǒng),繼承了Unix系統(tǒng)強(qiáng)大的功能和性能,采用與Unix系統(tǒng)兼容的操作命令,學(xué)會(huì)操作Linux一般就會(huì)操作UNIX系統(tǒng),學(xué)會(huì)在Linux下開(kāi)發(fā)應(yīng)用,就會(huì)在UNIX下開(kāi)發(fā)應(yīng)用Linux系統(tǒng)運(yùn)行于廉價(jià)的PC和大多數(shù)計(jì)算機(jī)系統(tǒng)硬件,開(kāi)放源碼,各種開(kāi)發(fā)軟件豐富齊全、免費(fèi)下載使用,如gcc、java、apache、hadoop、MLLIBLinux是廣大學(xué)生學(xué)習(xí)操作系統(tǒng)原理、計(jì)算機(jī)系統(tǒng)原理的優(yōu)秀實(shí)例系統(tǒng)Linux系統(tǒng)由芬蘭學(xué)生林納斯1991年開(kāi)發(fā)第1版,經(jīng)過(guò)20多年發(fā)展,已經(jīng)成為一種成熟、優(yōu)秀的操作系統(tǒng),已成為今天世界上使用最多的一種UNIX類操作系統(tǒng):Linux可安裝在各種計(jì)算機(jī)硬件設(shè)備中,比如個(gè)人計(jì)算機(jī)、大型機(jī)、超級(jí)計(jì)算機(jī)、Android手機(jī)、平板電腦、路由器,世界上運(yùn)算最快的10臺(tái)超級(jí)計(jì)算機(jī)全部運(yùn)行Linux操作系統(tǒng)2.Linux內(nèi)核版本Linux內(nèi)核是指由林納斯親自維護(hù)的Linux操作系統(tǒng)核心代碼2001年,Linux2.4版本內(nèi)核發(fā)布,2003年Linux2.6版本內(nèi)核發(fā)布,使Linux逐漸成為一個(gè)成熟的操作系統(tǒng)常見(jiàn)的Linux內(nèi)核版本有Linux2.4.20,Linux2.6、Linux3.2、Linux4.6.4等,其中r.x.y:r-主版本號(hào),x-偶數(shù)穩(wěn)定奇數(shù)開(kāi)發(fā),y-錯(cuò)誤修補(bǔ)次數(shù)3.Linux發(fā)行版本Linux發(fā)現(xiàn)版本是廠商將Linux內(nèi)核與外圍實(shí)用程序和文檔包裝,提供安裝界面和系統(tǒng)配置、管理工具等,形成發(fā)行系統(tǒng)目前主要發(fā)現(xiàn)版本有:RedHatEnterpriseLinux(RHEL):主要用作服務(wù)器Fedora
Ubuntu:界面美觀、功能強(qiáng)大CentOS:是Linux服務(wù)器最有名最常用的發(fā)行版.中標(biāo)麒麟(NeoKylin):普華Linux(i-soft)由于采用相同內(nèi)核,Linux應(yīng)用程序在不同版本間可做到二進(jìn)制代碼級(jí)兼容練習(xí)1.2Linux系統(tǒng)目錄結(jié)構(gòu)
一、目錄樹(shù)結(jié)構(gòu)Linux與所有Unix系統(tǒng)具有大體一致的目錄結(jié)構(gòu)是一顆以”/”為根目錄的樹(shù),無(wú)盤(pán)符概念,所有分區(qū)的文件掛載在某個(gè)目錄下各個(gè)目錄的取名和文件內(nèi)容有統(tǒng)一規(guī)定,是一種規(guī)范可根據(jù)目錄名和文件名推斷其大概功能/
/binbinary(二進(jìn)制)C:\WINDOWS\system32/bootboot
/devdevice
/etcetcetera(等等)注冊(cè)表/home
C:\DocumentsandSettings/include、/usr/include
/lib/usr/liblibrary(庫(kù))C:\WINDOWS\system32/lost+found
/mntmount
/optoption
/procprocess注冊(cè)表/root
/sbin/usr/sbinsystembinary
/selinux
securelinux
/srv
server
/tmptemporaryC:\Windows\Temp/usrUnixSystem(UserSoftware)ResourcesC:\ProgramFiles/varvariable
二、主要目錄說(shuō)明:三、Linux目錄結(jié)構(gòu)設(shè)計(jì)的好處①用戶創(chuàng)建的文件、檔案全部放在/home目錄下,規(guī)范、方便管理、可靠性好;②可創(chuàng)建專用系統(tǒng)分區(qū),保存Linux系統(tǒng)文件,以只讀方式掛載在/usr目錄下,安全性好;③可創(chuàng)建一個(gè)專用分區(qū),保存動(dòng)態(tài)增長(zhǎng)的文件檔案,以讀寫(xiě)方式掛載到/var目錄下,不影響其他文件;④所有的UNIX和Linux目錄結(jié)構(gòu)與上述規(guī)范大體相似,同時(shí)也方便了人們的學(xué)習(xí)。練習(xí):1.3Linux系統(tǒng)安裝、啟動(dòng)、登錄、用戶界面與命令格式
一、安裝、啟動(dòng)、登錄看視頻二、
三種系統(tǒng)操作界面
1.圖形界面2.命令界面
3.編程接口open、read、write、close等,本課程基本上就是學(xué)習(xí)Linux編程接口三、Linux命令格式1.Linux命令格式$命令名選項(xiàng)參數(shù)1參數(shù)2……命令名:由小寫(xiě)英文字母構(gòu)成的字符串,命令功能為英文單詞含義,如date、cp、mv、who、ls命令選項(xiàng):是對(duì)命令的特別定義,以“-”開(kāi)始,指示命令按特定模式執(zhí)行,產(chǎn)生輸出,如ls-l、ls-a若同時(shí)使用多個(gè)選項(xiàng),多個(gè)選項(xiàng)可用一個(gè)“-”連起來(lái),如ls–la命令選項(xiàng)出現(xiàn)順序一般沒(méi)有要求,如ls-l-a與ls-a–l功能相同
gcchello.c-ohello與gcc-ohello.chello功能相同命令參數(shù):提供命令運(yùn)行的信息,或者是命令執(zhí)行過(guò)程中所使用的文件名,從哪里可以得到輸入,以及把輸出送到什么地方
如:cpfile1file2、mvfile1dir1、mkdirdir2練習(xí):2.命令說(shuō)明(1)命令輸出,命令執(zhí)行成功與否判定執(zhí)行成功:輸出期望信息,或無(wú)任何輸出,直接顯示命令提示符$失敗:顯示出錯(cuò)信息,格式:”命令名:出錯(cuò)描述”示例:$cd$pwd/home/can$LS
bash:LS:commandnotfound
$
ls-P
ls:invalidoption-P$
ls-lPPls:cannotaccessPP:Nosuchfileordirectory(2)命令聯(lián)機(jī)幫助百度百科Info命令,如$infopwdMan命令,如$manpasswd(3)本課命令輸入描述說(shuō)明1.4Linux文件、目錄操作及文件屬性、權(quán)限
通常普通用戶的主要工作是文件檔案處理,輸入命令文件名運(yùn)行程序,通過(guò)命令從文件讀入輸入數(shù)據(jù),處理后,保存到另一文件。本課程所有實(shí)驗(yàn)任務(wù)都屬于這類工作Linux系統(tǒng)為每個(gè)普通用戶在/home目錄下創(chuàng)建了一個(gè)用戶名為目錄名的“家”,如用戶can的“家”是/home/can,用戶guest的“家”是/home/guest;但根用戶root的“家”在目錄/root普通用戶通常在其“家”目錄下進(jìn)行文檔處理,創(chuàng)建、修改、刪除文件檔案,不能增刪“家”之外其他目錄中的文件檔案(安全起見(jiàn))1.4.1目錄路徑與目錄操作
一、絕對(duì)路徑、工作目錄、相對(duì)路徑每個(gè)文件在某個(gè)目錄之下,要操作或訪問(wèn)某個(gè)文件,應(yīng)在命令或程序中通過(guò)路徑方式給出文件所在位置。給出文件路徑方法有兩種:1.絕對(duì)路徑:給出從根目錄開(kāi)始一直到所要操作文件名、中間以“/”隔開(kāi)的完整路徑。示例:$cat/etc/passwd、
$
more/home/can/NachOS-4.1/code/testfd=open("/home/can/work/f1",O_RDONLY);
fp=fopen("/home/can/work/f1","r+");2.工作目錄相對(duì)路徑:為縮短文件路徑字符串長(zhǎng)度,
Linux系統(tǒng)為每個(gè)命令窗口(Terminal)和應(yīng)用進(jìn)程設(shè)置一個(gè)工作目錄,工作目錄初始設(shè)置為用戶的“家”,可用命令cd改變當(dāng)用戶操作工作目錄中文件時(shí),僅需在命令中給出文件名,如touchf1若操作非工作目錄下文件,只需給出絕對(duì)路徑中除工作目錄之外的部分。示例:若當(dāng)前工作目錄為“/home/can”,則文件/home/can/NachOS-4.1/code/test/add.c可用相對(duì)路徑表示為NachOS-4.1/code/test/add.c,相應(yīng)命令檢視命令簡(jiǎn)化為cat
NachOS-4.1/code/test/add.c二、幾個(gè)特殊目錄(“.”、”..”、”~”、“-”)Linux系統(tǒng)定義幾個(gè)符號(hào)來(lái)表示一些常用的特殊目錄,給命令輸入帶來(lái)方便“.”:當(dāng)前工作目錄,若工作目錄為/home/can,則在文件路徑中,“.”等同于/home/can“..”:上一層目錄,若當(dāng)前目錄為/home/can,則“..”表示/home“-”:前一個(gè)工作目錄,如當(dāng)前工作目錄為/home/can,執(zhí)行cd/etc后,“.”表示/etc,而“-”表示/home/can;“~”:表”目前用戶”所在的家目錄,若但其用戶為can,則“~”表示/home/can;~guest代表
guest家目錄“/home/guest”。練習(xí):三、Linux目錄操作命令(cd,pwd,mkdir,rmdir,rm)1.cd(變換工作目錄)、pwd(顯示當(dāng)前工作目錄)cd(changedirectory)命令改變當(dāng)前工作目錄,使用pwd(printworkdirectory)命令顯示當(dāng)前工作目錄的絕對(duì)路徑通常人們喜歡將兩個(gè)命令聯(lián)合使用,用cd切換到目標(biāo)目錄,用pwd驗(yàn)證切換到哪里去了。范例:$
pwd/home/can$
cd~guest$pwd/home/guest
$cd~$
pwd/home/can$
cd
$
cd..$
pwd/home
$
cd-$
cd/var/spool/mail
$cd../mqueue思考題2.mkdir(創(chuàng)建目錄)、rmdir(刪除空目錄)、ls(檢視目錄),rm(刪除非空目錄)一般在某個(gè)mkdir、rmdir、rm命令后接一個(gè)ls(list)命令,列出文件目錄,以驗(yàn)證目錄創(chuàng)建、目錄刪除操作是否成功范例$cd/tmp$pwd
/tmp$rm-rf*
$ls
$mkdirtest
$ls
test$mkdirtest1test/subtest2
$ls.testtest1test2test:Sub$rmdirtest1
$rmdirtestrmdir:failedtoremove`test1':Directorynotempty$rm-rftest$ls
test23.ls(文件目錄檢視命令)
格式:$ls[-aAdfFhilRS]目錄名
常用選項(xiàng):-a:列出全部的檔案(或稱文件),連同文件名以“.”開(kāi)頭的隱藏檔案(文件)-A:列出全部的檔案,連同隱藏檔,但不包括.與..這兩個(gè)目錄,這個(gè)選項(xiàng)用得多;-F:根據(jù)檔案、目錄等信息,給予附加數(shù)據(jù)結(jié)構(gòu),例如:*:代表可執(zhí)行檔;/:代表目錄;=:代表socket檔案;|:代表FIFO檔案;-i:列出inode位置,而非列出檔案屬性;-l:以長(zhǎng)格式列出目錄內(nèi)容,包含檔案的屬性等等數(shù)據(jù),這個(gè)選項(xiàng)用得多;-R:連同子目錄內(nèi)容一起列出來(lái);-i:列出inode位置,而非列出檔案屬性;范例:$cd
$ls
DesktopNachos-3.4-for-ubuntu.tar.gzPublic
$ls-A.bash_history.lesshstPictures
…
$ls/etc…$ls-FDesktop/nachos-3.4/Pictures/fifo1|a.out*test/f1$ls-l~total24708drwxr-xr-x2rootroot40962012-08-2117:31Desktopdrwxr-xr-x2rootroot40962012-08-1823:27Documentsdrwxr-xr-x2rootroot40962012-08-1823:27Downloads-rw-r--r--1rootroot02015-02-0111:41f1prw-r--r--1rootroot02015-02-0111:38fifo1$ls-i686757Desktop686812nachos-4.0.tar807026Documents807159NachOS-4.1.bak$ls-ial683678-rw1rootroot74282014-04-0515:44.bash_history686917-rw-r--r--1rootroot31352012-08-1915:07.bashrc925835drwx5rootroot40962015-02-0108:07.cache678320drwx9rootroot40962012-10-2417:55.config1.4.2文件屬性與權(quán)限
一、文件屬性描述有9種,可用命令ls–l列出文件類型和訪問(wèn)權(quán)限位結(jié)構(gòu)二、文件訪問(wèn)權(quán)限1.操作權(quán)限含義對(duì)于普通文件、管道和設(shè)備等文件來(lái)寫(xiě)來(lái)說(shuō),r權(quán)限:該用戶能讀這個(gè)文件的內(nèi)容,w權(quán)限:表示能更改文件內(nèi)容x權(quán)限:能執(zhí)行這個(gè)文件代表的程序或命令對(duì)于目錄文件來(lái)說(shuō)r權(quán)限:能列該目錄內(nèi)容,w權(quán)限:在該目錄中增加或刪除文件,x權(quán)限:能用cd命令進(jìn)入該目錄示例:-rwxr-xr-x
1canusers 1234567 2015-02-0111:41 hellodrwxr-xr--2aliceusers40962015-02-0112:41 sub三、用文件目錄和索引節(jié)點(diǎn)(indexnode)管理文件屬性Linux文件屬性分為兩部分管理:文件名保存在文件目錄中,文件的其他屬性(文件大小、訪問(wèn)權(quán)限、…)保存在索引節(jié)點(diǎn)(I節(jié)點(diǎn))中,所有文件的I節(jié)點(diǎn)放到磁盤(pán)分區(qū)的特定區(qū)域,稱為I節(jié)點(diǎn)表索引節(jié)點(diǎn)與文件具有一一對(duì)應(yīng),若兩個(gè)文件的索引節(jié)點(diǎn)號(hào)相同,他們就是同一個(gè)文件創(chuàng)建文件必然創(chuàng)建新的索引節(jié)點(diǎn),為已存在文件創(chuàng)建新名字方法為:
”ln文件名
硬鏈接文件名”或”cp–l文件名
硬鏈接文件名”練習(xí)1.4.3Linux文件操作命令
一、復(fù)制、移動(dòng)與刪除文件(cp,rm,mv,ln)ln(link)用于建立硬鏈接與符號(hào)鏈接,硬連接指向同一索引節(jié)點(diǎn)的另一文件名;mv(move)用于移動(dòng)文件或目錄到一個(gè)新的目錄位置,也可以用于更名(rename)文件;rm(remove)用于移除文件,不但可刪除文件,還可刪除目錄。1.復(fù)制文件(cp)命令格式:cp[-adfilprsu]源文件(source)目的文件(destination)
cp[options]source1source2source3Directory
常用選項(xiàng):-f:為強(qiáng)制(force)的意思,若有重復(fù)或其它疑問(wèn)時(shí),不會(huì)詢問(wèn)使用者,而強(qiáng)制復(fù)制;-i:若目的文件(destination)已經(jīng)存在時(shí),在覆蓋時(shí)會(huì)先詢問(wèn)確認(rèn)-l:創(chuàng)建文件的硬連結(jié)(hardlink),而非復(fù)制檔案本身;-r:遞歸持續(xù)復(fù)制,用于目錄復(fù)制;-s:復(fù)制成為符號(hào)連結(jié)文件(symboliclink),亦即“快捷方式”文件;范例1(復(fù)制單個(gè)文件):將家目錄下的.bashrc復(fù)制到/tmp下,文件名改為bashrc$cd/tmp
$cp~/.bashrcbashrc$
ls范例2(復(fù)制單個(gè)文件):將/var/log/wtmp復(fù)制到/tmp底下,文件名不變$cd/tmp$cp/var/log/wtmp.$ls-l/var/log/wtmpwtmp-rw-rw-r--1rootutmp71808Jul1812:46/var/log/wtmp-rw-r--r--1rootroot71808Jul1821:58wtmp范例3:(復(fù)制整個(gè)目錄):復(fù)制/etc/這個(gè)目錄下的所有內(nèi)容到/tmp底下$cd/tmp
$cp/etc//tmp范例4(建立硬連接、符號(hào)鏈接):將范例一復(fù)制的bashrc建立一個(gè)硬鏈接和一個(gè)快捷方式$
ls-lbashrc$cp-sbashrcbashrc_slink或ln-sbashrcbashrc_slink$
cp-lbashrcbashrc_hlink或lnbashrcbashrc_hlink
$
ls-lbashrc*范例5(同時(shí)復(fù)制多個(gè)文件):將家目錄的.bashrc及.bash_history復(fù)制到/tmp底下$cp~/.bashrc~/.bash_history/tmp
2.rm(移除檔案或目錄)
命令格式:#rm[-fir]檔案或目錄常用選項(xiàng):-f:就是force的意思,強(qiáng)制移除;-i:互動(dòng)模式,在刪除前會(huì)詢問(wèn)使用者是否動(dòng)作-r:遞歸刪除啊!見(jiàn)文件刪文件,見(jiàn)目錄刪目錄范例1:復(fù)制一個(gè)文件然后刪除之$cd/tmp$cp~/.bashrcbashrc$rmbashrc范例2:刪除一個(gè)不為空的目錄$mkdirtest$cp~/.bashrctest/
$rmdirtestrmdir:`test‘:Directorynotempty$rm-rftest3.mv(移動(dòng)檔案與目錄,或更名)
常用格式:mv[-fiu]sourcedestination(檔案或目錄更名)
mv[options]source1source2source3Directory(檔案或目錄移動(dòng))
常用選項(xiàng):-f:force強(qiáng)制的意思,強(qiáng)制直接移動(dòng)而不詢問(wèn);-i:若目標(biāo)檔案(destination)已經(jīng)存在時(shí),就會(huì)詢問(wèn)是否覆蓋!-u:若目標(biāo)檔案已經(jīng)存在,且source比較新,才會(huì)更新(update)范例1(單個(gè)文件移動(dòng)):復(fù)制一檔案,建立一目錄,將檔案移動(dòng)到目錄中$
cd/tmp$cp~/.bashrcbashrc$mvbashrcmvtest
$
cd/tmp$cp~/.bashrcbashrc$mkdirmvtest$mvbashrcmvtest范例2:(目錄更名):將剛剛建立的目錄mvtest稱更名為mvtest2$mvmvtestmvtest2范例3:(多文件移動(dòng)):再建立兩個(gè)檔案,再全部移動(dòng)到/tmp/mvtest2中$cp~/.bashrcbashrc1$cp~/.bashrcbashrc2$mvbashrc1bashrc2mvtest2練習(xí)二、文件內(nèi)容查閱(cat,tac,head,tail,more,less,od)1.檢視文本文件內(nèi)容:cat,tac,head,tail,more,less(范例)$cat/etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/sh$more/etc/passwd……avahi-autoipd:x:103:108:Avahiautoipdaemon,,,:/var/lib/avahi-autoipd:/bin/falseavahi:x:104:109:AvahimDNSdaemon,,,:/var/run/avahi-daemon:/bin/false--More--(51%)$less/etc/passwd……avahi-autoipd:x:103:108:Avahiautoipdaemon,,,:/var/lib/avahi-autoipd:/bin/falseavahi:x:104:109:AvahimDNSdaemon,,,:/var/run/avahi-daemon:/bin/false2.創(chuàng)建與編輯文件(gedit,touch,dd)gedit:
創(chuàng)建和編輯文本文件(如源程序)touch:創(chuàng)建空文件,更新文件修改時(shí)間dd:創(chuàng)建指定大小,內(nèi)容初始化為0的文件gedit$gedit&或$geditp1.c(2)在/tmp目錄下新建一個(gè)空文件testtouch$cd/tmp$
touchtesttouch(3)在/tmp目錄下創(chuàng)建一個(gè)大小為10MB的文件testdd:$cd/tmp$
ddif=/dev/zeroof=testddcount=10240bs=1024$ls-ltestdd-rw-r--r--1rootroot0Jul1920:49testtouch1.4.4檔案屬性修改(touch,chmod)
文件其他屬性在文件編輯過(guò)程中自動(dòng)修改,文件權(quán)限信息通過(guò)chmod命令修改,文件所屬用戶、所屬用戶組用命令chown和chgrp修改chmod命令基本格式為:范例:創(chuàng)建文件f52、f521、f522,將f52權(quán)限更改為777,為所有用戶添加對(duì)f521讀寫(xiě)權(quán)限,去掉所有用戶對(duì)f522的寫(xiě)權(quán)限練習(xí):思考題1.161)一個(gè)Linux文件的八進(jìn)制數(shù)訪問(wèn)權(quán)限為755,用ls-l命令顯示的文件權(quán)限是什么?用ls-l命令顯示的文件權(quán)限是rw-r--r--,用八進(jìn)制數(shù)表示的權(quán)限值是多少?2)寫(xiě)出命令,在當(dāng)前目錄下創(chuàng)建文件f54,將其訪問(wèn)權(quán)限設(shè)置為664.3)當(dāng)前目錄下某個(gè)文件test.sh的權(quán)限是rw-r--r--,成功執(zhí)行命令chmod+xtest.sh后,test.sh的權(quán)限變成___________________,用八進(jìn)制數(shù)表示為_(kāi)___________。1.4.5使用通配符(*,-,?)一次操作多個(gè)文件(目錄)
*:匹配任何字符串?:匹配任何一個(gè)字符1.4.6檔案的壓縮與打包(tar命令)
一、文件打包和解包常用格式:$tar<選項(xiàng)>[壓縮文件]<文件列表>
常用選項(xiàng):
-cvf打包
-xvf解包
-czvf打包后壓縮成.gz格式恩及
-zxvf先對(duì).gz文件解壓縮,再解包
-cjvf打包并壓縮成.bz2格式文件
-xjvf先對(duì).bz2文件節(jié)壓縮,再解包范例:在當(dāng)前目錄下創(chuàng)建目錄dir5,在其中創(chuàng)建四個(gè)文件f1、f2、f3、f4,對(duì)該目錄打包并壓縮成文件dir5.tar.gz,刪除該目錄,然后解包dir5.gz:2.在Windows主機(jī)與Linux虛擬機(jī)之間進(jìn)行檔案互傳
(1)文本復(fù)制(2)文件拖放:看視頻練習(xí):總結(jié):即興總結(jié)課后作業(yè):命令練習(xí)實(shí)驗(yàn)第3章LinuxC編程環(huán)境本章概述本章的學(xué)習(xí)目標(biāo)主要內(nèi)容本章概述
本章介紹用Linux環(huán)境gcc開(kāi)發(fā)套件進(jìn)行程序編譯、調(diào)試、排錯(cuò)和項(xiàng)目管理的基本方法,是Linux環(huán)境使用C/C++進(jìn)行系統(tǒng)編程和應(yīng)用編程開(kāi)發(fā)的基礎(chǔ),其中涉及的方法原理也適用于Windows等非Linux環(huán)境本章學(xué)習(xí)目標(biāo)理解LinuxC程序的編譯、執(zhí)行過(guò)程,gcc命令選項(xiàng),自定義函數(shù)庫(kù)的制作;熟悉LinuxC程序編程錯(cuò)誤診斷與處理方法;熟悉使用Linux自帶的字符串運(yùn)算、排序算法、二叉樹(shù)算法庫(kù)編寫(xiě)應(yīng)用程序的基本方法;熟悉使用gdb/ddd調(diào)試C程序的基本方法;掌握利用命令行參數(shù)和環(huán)境變量給程序提供數(shù)據(jù);理解使用make工具管理大型C/C++編程項(xiàng)目。本章主要內(nèi)容LinuxC/C++程序編輯、編譯、執(zhí)行過(guò)程Linux常用系統(tǒng)庫(kù)函數(shù)及運(yùn)用C程序錯(cuò)誤診斷與處理*用gdb/ddd調(diào)試C/C++程序環(huán)境變量與命令行參數(shù)項(xiàng)目開(kāi)發(fā)管理工具make3.1LinuxC程序的編譯與執(zhí)行1.創(chuàng)建、編輯、編譯、執(zhí)行源程序方法(以hello.c為例)新建命令窗口,鍵入”gedit
hello.c&”,打開(kāi)編輯窗口,點(diǎn)擊其標(biāo)題行使其變成當(dāng)前窗口,直接輸入或粘貼源程序:#include<stdio.h>voidmain(){
printf("helloworld\n");}編譯和執(zhí)行程序鍵入編譯命令:gcc
hello.c
,產(chǎn)生可執(zhí)行程序a.out執(zhí)行程序命令:./a.out
helloworld命名規(guī)范:C程序:.cC++程序:.cpp或.C,可執(zhí)行程序:一般無(wú)擴(kuò)展名演示視頻見(jiàn):“3-1編輯、編譯和運(yùn)行一個(gè)C程序.exe”一.C/C++程序編譯過(guò)程2.C/C++程序編譯過(guò)程解剖無(wú)論是Windows還是Linux環(huán)境,從.c/.cpp源程序到可執(zhí)行程序,需要經(jīng)歷預(yù)處理、編譯、匯編、鏈接四個(gè)過(guò)程。
如果不需獲得中間結(jié)果,不加任何選項(xiàng)的gcc命令(如gcchello.c),將四個(gè)過(guò)程一次性執(zhí)行完,得到可執(zhí)行程序增加-E、-S、-c等選項(xiàng)的gcc命令可分別是完成預(yù)處理、編譯、匯編過(guò)程后停下來(lái),并獲得文件名后綴為.i、.s、.o的中間結(jié)果步驟一、預(yù)處理:處理所有以字符#開(kāi)頭的語(yǔ)句(頭文件展開(kāi)、宏替換、條件編譯).c.cpp.C文件.i文件步驟二、編譯:編譯C、C++源程序,
生成匯編語(yǔ)言程序.s
文件步驟三、匯編:將匯編程序翻譯成目標(biāo)代碼文件.o文件步驟四、鏈接:將同一程序的多個(gè)目標(biāo)代碼文件和相關(guān)系統(tǒng)庫(kù)鏈接,產(chǎn)生可執(zhí)行文件可執(zhí)行文件.o文件庫(kù)文件編譯C/C++程序的四個(gè)過(guò)程以test.c為例演示C/C++程序編譯過(guò)程test.c:#include<stdio.h>#defineCHOICE11#defineCHOICE20#definePI3.14#defineS1(r)PI*(r)*(r)#defineS2(a,b)(a)*(b)voidmain(){#ifCHOICE1 { doubler; printf("請(qǐng)輸入圓的半徑r:"); scanf("%lf",&r); printf("圓的面積=%lf\n",S1(r)); }#endif#ifCHOICE2 { doublea,b; printf("請(qǐng)輸入矩形的長(zhǎng)和寬a,b:"); scanf("%lf%lf",&a,&b); printf("矩形的面積=%lf\n",S2(a,b)); }#endif}(1)預(yù)處理(命令為gcctest.c-E-otest.i)選項(xiàng)-E表示完成預(yù)處理階段就停下來(lái),-otest.i指示輸出文件名為test.itest.i內(nèi)容:……externvoidfunlockfile(FILE*__stream)__attribute__((__nothrow__,__leaf__));#943"/usr/include/stdio.h"34#2"test.c"2voidmain(){
{doubler;printf("請(qǐng)輸入圓的半徑r:");scanf("%lf",&r);printf("圓的面積=%lf\n",3.14*(r)*(r));
}#23"test.c"}宏S1(r)被替換成PI*(r)*(r)PI被替換成3.14頭文件stdio.h在這里展開(kāi)#if條件為1的分支代碼留下:#ifCHOICE1…#endif(2)
編譯(命令為gcc-Stest.i或
gcc-Stest.c-otest.s選項(xiàng)-S表示執(zhí)行完第二步產(chǎn)生匯編語(yǔ)言文件就停下來(lái)用-o指定匯編代碼文件名,若缺省則為test.stest.s內(nèi)容: .file "test.c" .section .rodata//只讀數(shù)據(jù)段標(biāo)志,包括字符串常量等.LC0: .string “\350\257\267\350\276\223\345\205\245\345\234\206\347\232\204\345\215\212\345\276\204r:“//字符串:"請(qǐng)輸入圓的半徑r:”.LC1: .string “%lf”//scanf語(yǔ)句的格式串:“%lfr.LC3: .string "\345\234\206\347\232\204\351\235\242\347\247\257=%lf\n"
//字符串:圓的面積=%lf\n.text//
文本段標(biāo)志:為C/C++程序產(chǎn)生的指令放在這里
.globl main//main也是一個(gè)全局符號(hào),是其代碼所在地址 .type main,@functionmain:.LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset8 .cfi_offset5,-8 movl %esp,%ebp .cfi_def_cfa_register5 andl $-16,%esp subl $32,%esp
movl $.LC0,(%esp)//將字符串“請(qǐng)輸入圓的半徑r:”的地址壓入堆棧 call printf//調(diào)用printf函數(shù),其參數(shù)在堆棧中 leal 24(%esp),%eax//取參數(shù)r的地址
movl %eax,4(%esp)
movl $.LC1,(%esp) call __isoc99_scanf//調(diào)用scanf函數(shù),其參數(shù)都在堆棧中, fldl 24(%esp)//參數(shù)1最后壓入堆棧 fldl .LC2 fmulp %st,%st(1) fldl 24(%esp)…..(3)匯編(命令為gcc-ctest.c或gcc-ctest.i-otest.o)選項(xiàng)-c表示產(chǎn)生.o目標(biāo)文件就停下來(lái)目標(biāo)文件test.o是二進(jìn)制文件,可用命令nm查詢其中定義了哪些符號(hào)(函數(shù)名、全局變量名)、是否有定義?$nmtest.o
U__isoc99_scanf 00000000Tmain
Uprintf由于test.o中不包括printf、scanf函數(shù)實(shí)現(xiàn),test.o還不能執(zhí)行。(4)鏈接(不帶-E、-S、-c選項(xiàng)的gcc命令:gcctest.c-otest
gcctest.o-otest)可用命令nmtest來(lái)查看test中變量、函數(shù)定義情況
U__isoc99_scanf@@GLIBC_2.7w_ITM_deregisterTMCloneTablew_ITM_registerTMCloneTable08049f10d__JCR_END__08049f10d__JCR_LIST__w_Jv_RegisterClasses08048530T__libc_csu_fini080484c0T__libc_csu_initU__libc_start_main@@GLIBC_2.00804846dTmainUprintf@@GLIBC_2.0test已經(jīng)有printf和scanf函數(shù)相關(guān)庫(kù)函數(shù)信息了。演示視頻見(jiàn):“3-2生成一個(gè)C程序的預(yù)處理代碼、匯編代碼、目標(biāo)代碼和可執(zhí)行文件.exe”二、多文件編譯calc.h:doubleaver(double,double);doublesum(double,double);aver.c#include"calc.h"doubleaver(doublenum1,doublenum2){return(num1+num2)/2;}sum.c:doubleasum(doublenum1,doublenum2){return(num1+num2);}1.項(xiàng)目構(gòu)成文件libtest.c:#include<stdio.h>#include"calc.h"intmain(intargc,char*argv[]){doublev1,v2,m,sum2;v1=3.2;v2=8.9;m=aver(v1,v2);sum2=asum(v1,v2);printf("Themeanof%3.2fand%3.2fis%3.2f\n",v1,v2,m);printf("Thesumof%3.2fand%3.2fi5%3.2f\n",v1,v2,sum2);return0;}2.編譯方法(1)第一種編譯方法先將各個(gè).c文件編譯成.o文件$gcc-csum.c$gcc-caver.c$gcc-clibtest.c再鏈接各個(gè).o文件,生成可執(zhí)行文件,并執(zhí)行之$gcc-olitestsum.oaver.olibtest.o$./libtest(2)第二種編譯方法將所有.c文件名放到一條gcc命令進(jìn)行編譯$
gccsum.caver.clibtest.c-olibtest(3)創(chuàng)建makefile文件,用make工具及性能編譯,適合于大型開(kāi)發(fā)項(xiàng)目,后面介紹演示視頻:見(jiàn)“3-3編譯多個(gè)源文件構(gòu)成的程序.exe”三、動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的創(chuàng)建與使用1.靜態(tài)庫(kù)模型2.動(dòng)態(tài)庫(kù)模型可執(zhí)行程序可執(zhí)行程序3.創(chuàng)建和使用靜態(tài)庫(kù)(將aver.c和sum.o創(chuàng)建靜態(tài)庫(kù),libtest.c調(diào)用它們)先編譯庫(kù)函數(shù)源程序:$gcc-c-oaver.oaver.c$gcc-c-osum.osum.c
創(chuàng)建靜態(tài)庫(kù)libmycal.a$arrclibmycalc.aaver.osum.o編譯應(yīng)用程序libtest.c$gcclibtest.c-Bstatic-L.-lmycalc-olibtesta執(zhí)行程序:$./libtesta討論:mathl.c的編譯命令如何寫(xiě)?4.創(chuàng)建和使用動(dòng)態(tài)庫(kù)(將aver.c和sum.o創(chuàng)建動(dòng)態(tài)庫(kù),libtest.c調(diào)用它們)編譯源程序,產(chǎn)生目標(biāo)代碼(-fPIC產(chǎn)生位置無(wú)關(guān)代碼):$gcc-c-fPICaver.c-oaver.o$gcc-c-fPICsum.c-osum.o創(chuàng)建動(dòng)態(tài)庫(kù)$gcc-shared-olibmycalc.soaver.osum.o編譯應(yīng)用程序:$gcclibtest.c-L.-olibtestso-lmycalc添加共享庫(kù)目錄路徑$
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:.執(zhí)行程序$./libtestsoThemeanof3.20and8.90is6.05Thesumof3.20and8.90is12.103.2Linux自帶系統(tǒng)庫(kù)一、常用庫(kù)函數(shù)(猜測(cè)函數(shù)功能)數(shù)學(xué)運(yùn)算函數(shù)(math.h,libm.so,libm.a):pow(x,y)、sqrt(x)、exp(x)、log(x)、log10(x)、ceil(x)、floor(x)、fabs(x),sin、cos、tan、ctan、cosh、tanh、cosh字符串處理函數(shù)strcat,strcpy,strncpy,bcopy,memcpy;strcmp,strncmp,strcasecmp,strncasecmp,bzero,memset,index,strchr,rindex,strrchr,memchr,memrchrstrstr,strcasestrstrtok,strupr,atoi,strtol,strtod時(shí)間函數(shù)time,asctime,ctime數(shù)據(jù)結(jié)構(gòu)算法函數(shù)二分搜索:bsearch;線性搜素:lfind,lsearch;快速排序:qsort二叉樹(shù)算法:tsearch,tfind,twalk,tdelete,tdestroy二、庫(kù)函數(shù)使用示例與練習(xí)(1)字符串處理函數(shù)示例(調(diào)用字符串處理庫(kù)函數(shù))1.編寫(xiě)程序,輸入兩個(gè)字符串s1、s2,將s1中所有s2子串刪去后輸出。如s1=“Thisismymotheruniversity”,s2=“er”,則輸出為”Thisismymothunivsity”2(3.22)編寫(xiě)程序,輸入一個(gè)Linux命令串s1,輸出各命令參數(shù),每行一個(gè)。例如:若輸入的命令字符串是“l(fā)s-l-aabc*”,則程序輸出為:ls-l-aabc*3.編寫(xiě)程序,輸入一個(gè)Linux命令串s1,找出并顯示命令名、命令選項(xiàng)、命令參數(shù)。例如:若輸入的命令字符串是"ls-l-aabc*",則程序輸出應(yīng)該是:
命令名:ls
命令選項(xiàng):-l
命令選項(xiàng):-a
命令參數(shù):abc*4.練習(xí)題3.35.編寫(xiě)程序,輸入gcc編譯命令,并對(duì)其進(jìn)行解析,要求解析出命令名、命令參數(shù)(源程序名)、命令選項(xiàng)(僅限-E、-S、-c、-o輸出文件名),如果沒(méi)有-o選項(xiàng),要給出缺省輸出文件名。例如:1)如果輸入gcctest.c則應(yīng)輸出:
命令名:gcc
命令功能:生成可執(zhí)行程序
輸入文件名:test.c
輸出文件名:a.out2)如果輸入gcctest.c-c-otest.o或gcc-ctest.c,則輸出為:
命令名:gcc
命令功能:產(chǎn)生目標(biāo)代碼文件
輸入文件名:test.c
輸出文件名:test.o
(2)快速排序和搜索函數(shù)使用示例1.調(diào)用qsort函數(shù),對(duì)整型數(shù)組intnum[10]={90,51,32,83,94,45,36,47,28,19}進(jìn)行排序2.練習(xí)題3.4寫(xiě)一個(gè)程序調(diào)用qsort函數(shù),對(duì)浮點(diǎn)型數(shù)組intnum[10]={90.9,51.8,32.7,83.6,94.5,45.4,36.3,47.2,28.1,19.0}進(jìn)行排序,運(yùn)行程序驗(yàn)證正確性。3(習(xí)題3.24).假設(shè)有一個(gè)字符數(shù)組charnum[10][]={"hello","world","we","dgut","university","abc","china","Dongguan","Guangdong","Songshanhu","computer"}(1)寫(xiě)一個(gè)程序,調(diào)用Linux系統(tǒng)的qsort庫(kù)函數(shù),對(duì)組進(jìn)num行排序后,按順序輸出各字符串的值(3)二叉樹(shù)函數(shù)使用示例1.編寫(xiě)程序,它將12個(gè)隨機(jī)整數(shù)插入二叉樹(shù),然后進(jìn)行中序遍歷,按順序輸出各個(gè)數(shù)。隨機(jī)數(shù)產(chǎn)生方法:rand()*0xffff2.(作業(yè)3.24)3.3Linux編程錯(cuò)誤診斷和處理一、錯(cuò)誤分類1.編譯錯(cuò)誤:編譯時(shí)報(bào)出的錯(cuò)誤,有Error、Warning兩種Error是致命錯(cuò)誤,存在Error錯(cuò)就意味著編譯失敗,一不會(huì)產(chǎn)生輸出文件Warning是警告錯(cuò),僅存在Warning錯(cuò)誤,編譯仍然可以成功,產(chǎn)生輸出文件需人工診斷并排錯(cuò)2.運(yùn)行錯(cuò)誤:括程序運(yùn)行結(jié)果不正確和程序運(yùn)行崩潰兩種診斷和排錯(cuò)往往困難很多排錯(cuò)方法:閱讀源代碼、輸出檢查變量值、gdb調(diào)試設(shè)計(jì)錯(cuò)誤處理機(jī)制:try…catch;assert;錯(cuò)誤處理包裝庫(kù)wrapper
二、常見(jiàn)編譯錯(cuò)誤處理分類變量無(wú)定義變量重復(fù)定義缺少表達(dá)符號(hào),括號(hào)、else不匹配等找不到文件非法中文全角字符、標(biāo)點(diǎn)符號(hào)、括號(hào)鏈接階段找不到庫(kù)文件編譯警告(Warning)較難診斷的錯(cuò)誤示例1.找不到文件程序1:#include<stdio.h>
voidmain(){}程序2:#include"my.h"main(){}2.非法中文全角字符、標(biāo)點(diǎn)符號(hào)、括號(hào)程序1:main(){charstr[100];inti;}3.找不到庫(kù)文件程序1:#include"wrapper.h"intmain(){charc;intin,out;in=Open("file.in",O_RDONLY,0);out=Open("file.out",O_WRONLY|O_CREAT,0666);while(Read(in,&c,1)==1)Write(out,&c,1);Close(in);Close(out);exit(0);}程序2:#include"wrapper.h"void*thread(void*vargp);intmain(){pthread_ttid;Pthread_create(&tid,NULL,thread,NULL);exit(0);}void*thread(void*vargp){Sleep(1);printf("Hello,world!\n");returnNULL;}4.編譯警告程序1:main(){fun();}voidfun(){}程序2:main(){strlen("abcd");}程序3:intmain(intargc,char*argv[]){doublev1,v2,m,sum2;v1=3.2;v2=8.9;sum2=Sum(v1,v2);printf("Thesumof%3.2fand%3.2fi5%3.2lf\n",v1,v2,sum2);return0;}doubleSum(doublenum1,doublenum2){return(num1+num2);}練習(xí):3.53.6二、系統(tǒng)調(diào)用失敗處理1.系統(tǒng)調(diào)用失敗問(wèn)題的提出(1)程序test1.c在無(wú)數(shù)據(jù)文件時(shí)的運(yùn)行情況:#include<stdio.h>#include<fcntl.h>voidmain(){intfd,fd1,i;charc;fd=open("1.txt",O_RDONLY);for(i=0;i<10;i++){read(fd1,&c,1);write(1,&c,1);}}(2)存在數(shù)據(jù)文件時(shí)運(yùn)行情況(3)添加函數(shù)執(zhí)行失敗檢測(cè)后的代碼test2.c及運(yùn)行情況#include<stdio.h>#include<fcntl.h>voidmain(){intfd,fd1,i,ret;charc;fd=open("2.txt",O_RDONLY,0);if(fd==-1){fprintf(stderr,"fileopenerror:%s\n",strerror(errno));}
for(i=0;i<10;i++)
{ret=read(fd1,&c,1);if(ret==-1){fprintf(stderr,"filereaderror:%s\n",strerror(errno))}write(1,&c,1);}}這樣寫(xiě)代碼的問(wèn)題:…2.RandyBryant對(duì)系統(tǒng)調(diào)用的處理方法(1)對(duì)系統(tǒng)調(diào)用函數(shù)做包裝,包裝代碼中檢查是否失敗,并調(diào)用unix_error進(jìn)行錯(cuò)誤處理,及時(shí)給出錯(cuò)誤提示intOpen(constchar*pathname,intflags,mode_tmode){intrc;if((rc=open(pathname,flags,mode))<0) unix_error("Openerror");returnrc;}
ssize_tRead(intfd,void*buf,size_tcount){ssize_trc;if((rc=read(fd,buf,count))<0) unix_error("Readerror");returnrc;}特點(diǎn):原函數(shù)名首字母大寫(xiě)即為包裝函數(shù)名,參數(shù)類型與列表完全相同,使用方便
(2)包裝函數(shù)使用方法所有包裝函數(shù)聲明寫(xiě)入頭文件wrapper.h,該文件還包含了stdio.h等常用頭文件,對(duì)多數(shù)程序來(lái)說(shuō),只需一個(gè)頭文件wrapper.h,其他頭文件包含語(yǔ)句都可省去包裝函數(shù)實(shí)現(xiàn)在庫(kù)libwrapper.h中,使用包裝函數(shù)的程序在gcc編譯命令中要添加
–L.和-lwrapper兩個(gè)選項(xiàng)如:
gcc-otest3test3.c-L.-lwrapper(3)使用包裝函數(shù)后的程序示例test3.c#include"wrapper.h"voidmain(){intfd,fd1,i;charc;fd=Open("1.txt",O_RDWR,0);for(i=0;i<10;i++){Read(fd1,&c,1);Write(1,&c,1);}}練習(xí):3.7三、用斷言檢查程序狀態(tài)錯(cuò)誤
用GDB/ddd調(diào)試器診斷運(yùn)行錯(cuò)誤不講、自學(xué)3.5命令行參數(shù)和環(huán)境變量讀取1.環(huán)境變量讀取示例:envtest.c#include<stdio.h>#include<stdlib.h>intmain(){char*s1,*s2,*s3;s1=getenv("PWD");//讀取系統(tǒng)環(huán)境變量PWDs2=genenv("PATH");//讀取系統(tǒng)環(huán)境變量PATH
s3=getenv("PHONE");//讀取自定義環(huán)境變量PHONEprintf("當(dāng)前工作目錄為:%s\n",s1);printf("當(dāng)前命令搜索路徑為:%s\n",s2); printf("單位電話為:%s\n",s3);}$gccenvtest.c-oenvtest?
$exportPHONE
#創(chuàng)建自定義環(huán)境變量$./envtest?當(dāng)前工作目錄為:/home/can/exp當(dāng)前命令搜索路徑為:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
單位電話為號(hào)為:0769-228611122.命令行參數(shù)使用示例(cmdpar.c)#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){inti;printf("以空格分隔的參數(shù)個(gè)數(shù)(包括程序名本身):%d\n",argc);for(i=0;i<argc;i++) printf("命令行參數(shù)argv[%d]=%s\n",i,argv[i]);}$gcccmdpar.c-ocmdpar?$./cmdparparam1參數(shù)2"complexparam"?以空格分隔的參數(shù)個(gè)數(shù)(包括程序名本身):4命令行參數(shù)argv[0]=./2-3命令行參數(shù)argv[1]=param1命令行參數(shù)argv[2]=參數(shù)2命令行參數(shù)argv[3]=complexparam練習(xí):3.9,3.103.5make工具自學(xué)總結(jié):即興總結(jié)課后作業(yè):寫(xiě)程序或程序分析:3.14、3.17、3.22、3.23,3.4第4章輸入輸出與文件系統(tǒng)本章概述本章的學(xué)習(xí)目標(biāo)主要內(nèi)容概述
文件系統(tǒng)是操作系統(tǒng)中負(fù)責(zé)存儲(chǔ)和管理信息的模塊,它用統(tǒng)一的方式管理用戶和系統(tǒng)信息的存儲(chǔ)、檢索、更新、共享和保護(hù),并為用戶提供一整套方便有效的文件使用和操作方法。對(duì)計(jì)算機(jī)類專業(yè)學(xué)生來(lái)說(shuō),學(xué)習(xí)文件系統(tǒng)基本工作原理,掌握文件和I/O編程的基本方法,對(duì)未來(lái)開(kāi)發(fā)出效率高、可靠性好有很大幫助,是理解計(jì)算機(jī)系統(tǒng)工作原理的重要部分,也是未來(lái)從事相關(guān)研究與應(yīng)用優(yōu)化的基礎(chǔ)知識(shí)。本章主要講授文管理系統(tǒng)結(jié)構(gòu)、系統(tǒng)級(jí)I/O、內(nèi)核文件I/O數(shù)據(jù)結(jié)構(gòu)、文件組織、文件物理結(jié)構(gòu)等。學(xué)習(xí)目標(biāo)了解文件系統(tǒng)層次結(jié)構(gòu)和文件I/O庫(kù)之間關(guān)系、應(yīng)用場(chǎng)合、性能比較掌握使用系統(tǒng)級(jí)I/O函數(shù)進(jìn)行文件I/O、文件元數(shù)據(jù)讀取的基本編程方法,能根據(jù)應(yīng)用需求進(jìn)行I/O庫(kù)選擇掌握內(nèi)核文件I/O數(shù)據(jù)結(jié)構(gòu)的用途與文件打開(kāi)過(guò)程,理解文件描述符含義、文件共享原理,以及I/O重定向原理掌握文件組織和文件物理結(jié)構(gòu),能進(jìn)行優(yōu)劣對(duì)比分析,理解提高文件搜索效率的基本方法本章主要內(nèi)容什么是UNIXI/O(或系統(tǒng)級(jí)I/O)Linux如何給新建文件設(shè)置操作權(quán)限使用系統(tǒng)級(jí)I/O函數(shù)進(jìn)行輸入輸出的基本方法Linux內(nèi)核如何對(duì)打開(kāi)文件實(shí)施管理文件描述符復(fù)制dup和I/O重定向?qū)崿F(xiàn)原理RIO健壯I/O包及使用方法如何讀取文件元數(shù)據(jù)內(nèi)存映射原理與編程方法各種I/O庫(kù)函數(shù)的區(qū)別與聯(lián)系4.1什么叫UNIXI/O一、輸入輸出的概念輸入/輸出(I/O)是在主存和外部設(shè)備(如磁盤(pán)驅(qū)動(dòng)器、終端和網(wǎng)絡(luò))之間傳遞數(shù)據(jù)的過(guò)程所有語(yǔ)言的運(yùn)行時(shí)系統(tǒng)(函數(shù)庫(kù))都提供執(zhí)行I/O的執(zhí)行I/O的函數(shù)庫(kù),比如C/C++提供:scanf、printf、cout<<、cin>>等Linux提系統(tǒng)級(jí)UNIXI/O系統(tǒng)調(diào)用庫(kù),來(lái)實(shí)現(xiàn)這些I/O庫(kù)函數(shù)大多數(shù)應(yīng)用開(kāi)發(fā)僅需使用上層I/O函數(shù),毋須直接使用UNIXI/O二、學(xué)習(xí)UNIXI/O的意義學(xué)習(xí)UNIXI/O有助于理解其他系統(tǒng)概念,如管道、I/O重定向、守護(hù)進(jìn)程實(shí)現(xiàn)I/O是系統(tǒng)操作不可或缺的組成部分,是理解上層I/O庫(kù)工作原理的基礎(chǔ)某些場(chǎng)景下進(jìn)行I/O編程(如網(wǎng)絡(luò)編程、管道、讀取文件元數(shù)據(jù))必須使用UNIXI/O三、UNIX文件和UNIXI/O概念一個(gè)UNIX文件就是一個(gè)m個(gè)字節(jié)的序列:B0,B1,…,Bk,…,Bm-1所有的I/O設(shè)備,如鍵盤(pán)、網(wǎng)絡(luò)、磁盤(pán)和終端,都被模型化為文件,可稱為設(shè)備文件,所有的輸入和輸出都用對(duì)相應(yīng)文件的讀和寫(xiě)來(lái)執(zhí)行。這種將設(shè)備優(yōu)雅地映射為文件的方式,允許UNIX內(nèi)核引出一個(gè)簡(jiǎn)單、低級(jí)的應(yīng)用接口,用于文件操作,稱為UNIXI/O,又稱系統(tǒng)I/O四、UNIXI/O(系統(tǒng)級(jí)I/O)構(gòu)成open函數(shù):打開(kāi)文件。應(yīng)用程序調(diào)用open要求內(nèi)核打開(kāi)相應(yīng)的文件,來(lái)宣告它想要訪問(wèn)一個(gè)I/O設(shè)備或文件。內(nèi)核返回文件描述符,一個(gè)小的非負(fù)整數(shù),以后操作用描述符來(lái)標(biāo)識(shí)該文件,內(nèi)核記錄有關(guān)這個(gè)打開(kāi)文件的所有信息(文件屬性、讀寫(xiě)指針),應(yīng)用程序只需記住這個(gè)描述符系統(tǒng)將自動(dòng)打開(kāi)鍵盤(pán)、正常輸出窗口(屏幕)、錯(cuò)誤輸出窗口三個(gè)設(shè)備文件,返回前三個(gè)文件描述符0、1、2,分別稱為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出lseek函數(shù):改變當(dāng)前的文件位置每個(gè)打開(kāi)文件都保持著一個(gè)讀寫(xiě)位置,其值是從距離文件起始位置的字節(jié)偏移量,新打開(kāi)文件的讀寫(xiě)位置在文件其實(shí)位置,值為0,隨讀寫(xiě)操作移動(dòng),或通過(guò)調(diào)用函數(shù)lseek移動(dòng)到任何位置read函數(shù):讀取文件數(shù)據(jù)。從文件當(dāng)前讀寫(xiě)位置傳遞n個(gè)字節(jié)到內(nèi)存,讀寫(xiě)指針向后移動(dòng)n個(gè)字節(jié)若讀寫(xiě)指針移動(dòng)到最后一個(gè)字節(jié)之后,則觸發(fā)EOF條件,返回-1,用于判斷到達(dá)文件尾write函數(shù):向文件寫(xiě)入數(shù)據(jù),并移動(dòng)讀寫(xiě)指針close函數(shù):關(guān)閉文件,回收內(nèi)核打開(kāi)文件結(jié)構(gòu)內(nèi)容,將未寫(xiě)入文件數(shù)據(jù)flush到文件,將文件屬性寫(xiě)回外存4.2文件打開(kāi)和關(guān)閉函數(shù)一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)清洗機(jī)鋁合金皮帶輪數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)流線性隱藏式快速閘機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)法蘭鑄銅閘閥數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)汽車安全攝像頭數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)天然植物有效成分提取物數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)固定三爪頂拔器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)雙人晃板數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)單針鎖式之字縫高速縫紉機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)前置式兒童座椅數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)公仔手機(jī)座數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 普通話發(fā)聲訓(xùn)練
- 嬰兒痙攣癥的診療
- 世界地理第九章美洲
- 江蘇師范大學(xué)成人繼續(xù)教育網(wǎng)絡(luò)課程《中國(guó)近現(xiàn)代史綱要》單元測(cè)試及參考答案
- GB/T 7631.2-2003潤(rùn)滑劑、工業(yè)用油和相關(guān)產(chǎn)品(L類)的分類第2部分:H組(液壓系統(tǒng))
- GB/T 6404.1-2005齒輪裝置的驗(yàn)收規(guī)范第1部分:空氣傳播噪聲的試驗(yàn)規(guī)范
- GB/T 21782.5-2010粉末涂料第5部分:粉末空氣混合物流動(dòng)性的測(cè)定
- GB/T 16292-2010醫(yī)藥工業(yè)潔凈室(區(qū))懸浮粒子的測(cè)試方法
- 《網(wǎng)絡(luò)傳播學(xué)概論》(第四版)-課件
- 福建省普通高中畢業(yè)生綜合素質(zhì)評(píng)價(jià)報(bào)告
- 電鍍線哈氏片判定標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論