浙師大Linux操作系統(tǒng)期末復(fù)習(xí)_第1頁
浙師大Linux操作系統(tǒng)期末復(fù)習(xí)_第2頁
浙師大Linux操作系統(tǒng)期末復(fù)習(xí)_第3頁
浙師大Linux操作系統(tǒng)期末復(fù)習(xí)_第4頁
浙師大Linux操作系統(tǒng)期末復(fù)習(xí)_第5頁
已閱讀5頁,還剩151頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Linux操作系統(tǒng)期末復(fù)習(xí)題型:選擇題(20個20分)填空題(10個10分)簡答題(9個45分)編程題(5個25分)操作系統(tǒng)的演變單道批處理系統(tǒng)(batchsystem)串行執(zhí)行預(yù)先組織好的一組任務(wù)提高了系統(tǒng)效率。多道批處理系統(tǒng)

可以交錯運行多個程序再次提高系統(tǒng)效率。典范:為IBMSystem/360機開發(fā)的OS/360分時系統(tǒng)(TimeSharingSystem)將處理器的運行時間分成數(shù)片,均分或依照一定權(quán)重派發(fā)給系統(tǒng)中的用戶使用快速響應(yīng)典范:Multics,Unix操作系統(tǒng)的發(fā)展操作系統(tǒng)的演變實時系統(tǒng)(RealTimeSystem)

系統(tǒng)能及時響應(yīng)外部事件的請求應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域典范:VxWorks操作系統(tǒng)的發(fā)展<>歷史悠久的Unix為了改進批處理系統(tǒng)不令人滿意又缺乏效率的方案,Dartmouth大學(xué)和MIT發(fā)明了分時(timesharing)系統(tǒng)。Dartmouth的系統(tǒng)只能運行Basic程序并取得短期的商業(yè)效益,而MIT的系統(tǒng)CTSS則是為通用的分時系統(tǒng)開發(fā)的,并在科研領(lǐng)域取得了巨大成功。1965年在美國國防部高級研究計劃署DARPA的支持下,MIT、AT&TBellLab和GE決定開發(fā)一種“公用計算服務(wù)系統(tǒng)”,希望能夠同時支持整個波士頓所有的分時用戶。該系統(tǒng)稱作Multics(MULTiplexedInformationandComputingService)。<>歷史悠久的Unix

Multics設(shè)計目標(biāo)是通過電話線把遠程終端接入計算機主機。但是,Multics研制難度超出了所有人預(yù)料。長期研制工作達不到預(yù)期目標(biāo),1969年4月貝爾實驗室退出,通用電氣公司也退出了。Multics引入了許多現(xiàn)代操作系統(tǒng)領(lǐng)域的概念雛形,比如分級的文件系統(tǒng),與設(shè)備獨立的用戶接口等思想,這些對隨后操作系統(tǒng)特別是Unix的成功有著巨大的影響。<>歷史悠久的Unix

1969年,貝爾實驗室退出Multics研制項目后,KenThompson和DennisM.Ritchie兩個研究人員一臺無人用的PDP-7上重新擺弄原先在Multics項目上設(shè)計的“空間旅行”游戲。為了使游戲能夠在PDP-7上順利運行,他們陸續(xù)開發(fā)了浮點運算軟件包、顯示驅(qū)動軟件,設(shè)計了文件系統(tǒng)、實用程序、shell和匯編程序。1970年,在一切完成后,給新系統(tǒng)起了個同Multics發(fā)音相近的名字Unix。注:PDP-7是美國DEC公司生產(chǎn)的小型機,其系列還包括PDP-11/40/45等機型。歷史悠久的Unix最初的Unix是用匯編語言編寫的。不久,Thompson用他自己設(shè)計的一種較高級的B語言重寫了該系統(tǒng)。但由于B語言的缺陷,Ritchie后來對B進行了改進,取名為C,接著又為C寫了一個很不錯的編譯器。Thompson和Ritchie合力用C語言重寫了Unix。C語言正是一種應(yīng)運而生的編程語言,直至今日仍然統(tǒng)治著系統(tǒng)程序編程領(lǐng)域。

1974年,Ritchie和Thompson在CACM上發(fā)表了一篇關(guān)于Unix里程碑式的論文—TheUNIXTime-SharingSystem。由于他們的卓越成就,他們于1983年被授予著名的圖靈獎。

KenThompsonC語言之父DennisM.Ritchie<>AT&T的SystemⅤ論文發(fā)表后,很多大學(xué)紛紛向貝爾實驗室索要UNIX的拷貝。由于貝爾實驗室的母公司AT&T當(dāng)時是一家受限制的壟斷企業(yè)而不能涉足計算機領(lǐng)域,所以AT&T沒有向這些大學(xué)收取費用。1984年,AT&T被美國政府分成了幾個子公司,這樣,它就可以合法地建立一個計算機子公司。很快,AT&T推出了它的第一個UNIX商業(yè)版本,SystemⅢ。但由于反映不盡如人意,翌年另一個改進版本SystemⅤ取代了它,而不為人知的SystemⅣ則成為計算機科學(xué)史上的一個謎。最早的SystemⅤ相繼被它的2、3、4版本代替,每一個版本都比它的前一代更龐大、更復(fù)雜。在此過程中,當(dāng)初設(shè)計UNIX的初衷——一個簡潔、優(yōu)美的系統(tǒng)—被逐漸拋到腦后。<>伯克利的UNIX—BSD加州大學(xué)伯克利分校是早期獲得第6版UNIX的大學(xué)之一。由于擁有完整的源代碼,伯克利得以從根本上修改UNIX。在DARPA的資助下,伯克利分校為PDP-11設(shè)計并發(fā)布了一個改進版本,叫作1BSD(FirstBerkeleySoftwareDistribution)。很快又有了2BSD。更為重要的是為VAX編寫的3BSD及其下一代產(chǎn)品4BSD。4BSD(包括4.3BSD和4.4BSD)有了很大改進。首先是虛擬內(nèi)存和分頁的使用,根據(jù)需要動態(tài)調(diào)入或調(diào)出內(nèi)存頁面,從而使得運行的程序能夠大于物理內(nèi)存。另一個改進是允許文件名可以多于14個字母。網(wǎng)絡(luò)的加入最終使BSD的網(wǎng)絡(luò)協(xié)議——TCP/IP成為比其他任何官方標(biāo)準(zhǔn)(如OSI)都更為廣泛使用的實際上的標(biāo)準(zhǔn)。伯克利的UNIX—BSD伯克利還在UNIX中加入了很多實用程序,包括一個新的編輯器(vi)、一個新的shell程序(csh)以及Pascal和Lisp的編譯器等等。這些進步使得Sun、DEC和其他計算機廠商將它們的UNIX版本基于伯克利的UNIX而不是AT&T的官方版本SystemⅤ。結(jié)果,伯克利的UNIX成為教學(xué)、科研和安全領(lǐng)域的主流。UNIX的標(biāo)準(zhǔn)化進程到了80年代后期,兩個不同的、互不兼容的UNIX版本——4.3BSD和SystemⅤRelease3都在廣為使用。另外,每一個UNIX供應(yīng)商事實上又在原有UNIX系統(tǒng)的基礎(chǔ)上加入了一些自己的非標(biāo)準(zhǔn)的東西。UNIX世界群雄割據(jù),又沒有標(biāo)準(zhǔn)的二進制程序格式,這樣就嚴(yán)重阻礙了UNIX的商業(yè)成功,因為軟件開發(fā)商不可能寫出一個適用于所有UNIX系統(tǒng)的程序。

第一次嘗試將這兩大UNIX統(tǒng)一起來的是IEEE標(biāo)準(zhǔn)委員會,這個項目被命名為POSIX,前三個字母代表可移植的操作系統(tǒng)(PortableOperatingSystem),加上IX是為了讓名字更加UNIX化。

POSIX委員會制定出一個稱為1003.1的標(biāo)準(zhǔn).UNIX的標(biāo)準(zhǔn)化進程然而,一些軟件供應(yīng)商,包括IBM、DEC、HP等并不喜歡AT&T對UNIX平臺的控制,因此它們建立了一個稱為OSF(OpenSoftwareFoundation,自由軟件聯(lián)盟)的聯(lián)盟,開發(fā)了一個符合所有IEEE和其他標(biāo)準(zhǔn)的系統(tǒng),這個系統(tǒng)包含很多其他特色,如窗口系統(tǒng)(X11)、圖形用戶界面(Motif)、分布式計算(DCE)、分布式管理(DME)。針對OSF的出現(xiàn),AT&T建立了一個自己的聯(lián)盟UI(UNIXInternational),事實上做的是相同事情。UI的UNIX是基于SystemⅤ的。結(jié)果是,有兩個工業(yè)集團提供各自的UNIX版本,因此使用者距離標(biāo)準(zhǔn)化反而較最初更遠了。另外,IBM還有自己的UNIX變種AIX,其他公司也各自擁有UNIX變體,混亂依然存在。UNIX的一些變種

IBMAIXSUNSolarisHPHP-UXFreeBSDLinuxiOSAndriod(?會出選擇題讓你選擇下面哪個不是UNIX系統(tǒng))Minix由于Unix的商業(yè)化導(dǎo)致源代碼不公開,大學(xué)里講授操作系統(tǒng)只能略去Unix的內(nèi)容而只講操作系統(tǒng)理論。不幸的是,只講理論使學(xué)生對實際的操作系統(tǒng)產(chǎn)生一個片面的認(rèn)識。書本中作為重點講述的內(nèi)容,如進程調(diào)度算法,實際中并沒有那么重要;而實際中很重要的內(nèi)容,如I/O系統(tǒng)和文件系統(tǒng)又因為缺乏理論性而被忽略。

Minix為了扭轉(zhuǎn)這種局面,荷蘭阿姆斯特丹Vrije大學(xué)計算機科學(xué)系的坦尼鮑姆(AndrewS.Tanenbaum)教授決定編寫一個在用戶看來和UNIX完全兼容,然而內(nèi)核全新的操作系統(tǒng)Minix。Minix沒有借用AT&T一行代碼,所以不受許可證的限制,它可以被班級和個人用來學(xué)習(xí)。通過它讀者可以剖析一個操作系統(tǒng),研究其內(nèi)容如何運作。其名稱源于“小Unix”,因為它非常簡潔,一般程度的讀者都可以讀懂它。

Minix的內(nèi)容大家可參閱坦尼鮑姆撰寫的教材《操作系統(tǒng):設(shè)計與實現(xiàn)》及http://www.M網(wǎng)站。

Minix和Linux的關(guān)系在Minix發(fā)布后不久,便出現(xiàn)了一個面向它的USENET新聞組,在數(shù)周內(nèi)便有多達40000個用戶訂閱該新聞組。其中的大多數(shù)人都想向Minix中加入一些新特性以使其更強大、更有用。每天都有數(shù)百人提供自己的建議、思想甚至代碼。而Minix的作者在幾年內(nèi)一直堅持不采納這些建議,目的是使Minix保持足夠的短小精悍,以便于學(xué)生理解。人們最終意識到不可能動搖作者的立場,于是一個芬蘭學(xué)生LinusTorvalds決定編寫一個類似于Minix的系統(tǒng),但是它特征繁多、面向?qū)嵱枚墙虒W(xué),這就是Linux。自由而奔放的黑馬-Linux誕生于學(xué)生之手成長于Internet壯大于自由而開放的文化TuxLinux的形象代表Linux:為x86體系結(jié)構(gòu)開發(fā)的類Unix操作系統(tǒng)Linux之父-LinusTorvalds芬蘭、赫爾辛基大學(xué)、1990起始于寫兩個進程然后寫驅(qū)動程序、文件系統(tǒng)、任務(wù)切換程序,從而形成一個操作系統(tǒng)雛形,并把它放在Internet上供大家下載修改Linux得以流行的原因之一-遵循POSIX標(biāo)準(zhǔn)POSIX表示可移植操作系統(tǒng)接口(PortableOperatingSystemInterface)POSIX是在Unix標(biāo)準(zhǔn)化過程中出現(xiàn)的產(chǎn)物。POSIX1003.1標(biāo)準(zhǔn)定義了一個最小的Unix操作系統(tǒng)接口任何操作系統(tǒng)只有符合這一標(biāo)準(zhǔn),才有可能運行Unix程序Linux的肥沃土壤-GNUGNU是GNUIsNotUnix的遞歸縮寫,是自由軟件基金會的一個項目。RichardStallman建立了GNU項目,要創(chuàng)建一個能夠自由發(fā)布的類UNIX系統(tǒng)。

GNU項目產(chǎn)品包括emacs編輯器、著名的GNUC和Gcc編譯器等,這些軟件叫做GNU軟件。GNU軟件和派生工作均適用GNU通用公共許可證,即GPL(GeneralPublicLicense

)Linux的開發(fā)使用了眾多的GNU工具GPL-開源軟件的法律GPL允許軟件作者擁有軟件版權(quán)但GPL規(guī)定授予其他任何人以合法復(fù)制、發(fā)行和修改軟件的權(quán)利。自由軟件運動的教父-RichardStallman理查德·馬修·斯托曼,1953年出生于美國紐約曼哈頓地區(qū),1971年進入哈佛大學(xué)學(xué)習(xí),同年受聘于麻省理工學(xué)院的人工智能實驗室(AILaboratory)。他是自由軟件運動的精神領(lǐng)袖、GNU計劃以及自由軟件基金會(FreeSoftwareFoundation)的創(chuàng)立者、著名黑客,Gcc,Emacs等軟件的作者。他最大的影響是為自由軟件運動豎立了道德、政治以及法律框架。

<>Linux系統(tǒng)或發(fā)布版

符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)內(nèi)核、Shell和外圍工具。

C語言編譯器和其他開發(fā)工具及函數(shù)庫XWindow窗口系統(tǒng)各種應(yīng)用軟件,包括字處理軟件、圖象處理軟件等。流行的Linux發(fā)布版本Slackwarelinuxredhatlinux

fedoraDebianlinux

UbuntuLinuxSuSElinuxTurbolinux紅旗linux流行的開源軟件ApacheMySQLOpenofficePHPPerl

用戶登錄到Linux后,每時每刻都處在某個目錄之中,此目錄稱為工作目錄(WorkingDirectory)或當(dāng)前目錄(CurrentDirectory)。工作目錄是隨時可以改變的。工作目錄用”.”表示,其父目錄用”..”表示.為了方便多用戶管理,Linux中一般用戶在/home下都有自己的主目錄,例如用戶zhang的主目錄是/home/zhang.用戶可以用“~”引用自己的主目錄。對文件進行訪問,需要用到路徑(Path)的概念.路徑是從某個目錄到某個文件的一條道路。路徑主要由目錄名稱構(gòu)成,目錄之間用“/”分開。路徑分為相對路徑和絕對路徑.絕對路徑是指從“根”開始的路徑;相對路徑是指從用戶工作目錄開始的路徑。Linux的文件系統(tǒng)基礎(chǔ)

/bin這個目錄存放著最經(jīng)常使用的命令。/boot存放的是啟動Linux時使用的一些核心文件,包括一些鏈接文件以及鏡像文件。/dev該目錄下存放的是Linux的外部設(shè)備,稱為設(shè)備文件。在Linux中訪問設(shè)備的方式和訪問文件的方式是相同的。/etc這個目錄用來存放所有的系統(tǒng)管理所需要的配置文件和子目錄。/home用戶的主目錄,在Linux中,每個用戶都有一個自己的目錄,例如用戶zhang的主目錄為/home/zhang.Linux的文件結(jié)構(gòu)/lib這個目錄里存放著系統(tǒng)最基本的動態(tài)鏈接共享庫/lost+found這個目錄一般情況下是空的,當(dāng)系統(tǒng)非法關(guān)機后,這里就存放了一些文件。/mnt系統(tǒng)提供這個目錄是為了讓用戶臨時掛載別的文件系統(tǒng)。/proc這個目錄是一個虛擬的目錄,它是系統(tǒng)內(nèi)存的映射,我們可以通過直接訪問這個目錄來獲取系統(tǒng)信息。/root超級管理員的主目錄。Linux的文件結(jié)構(gòu)/sbins就是SuperUser的意思,這里存放的是系統(tǒng)管理員使用的系統(tǒng)管理程序。/tmp這個目錄是用來存放一些臨時文件的。/usr要用到的很多應(yīng)用程序和文件幾乎都存放在該目錄下。

/var這個目錄中存放著在不斷擴充著的東西,習(xí)慣將那些經(jīng)常被修改的目錄放在這個目錄下。包括各種日志文件,電子郵件。Linux的文件結(jié)構(gòu)通配符bash下使用的通配符:?代表任何單一字符*代表任何字符串,可以是空串[字符組合]在中括號中的字符皆符合,例[a-z],[ace][!字符組合]不在中括號中的字符皆符合,例[!0-9]命令格式:command[-options][arguments]多用戶管理:adduser,deluser,passwd,su,who,id目錄相關(guān)的:pwd,cd,mkdir,rmdir,ls文件相關(guān)的:cp,mv,rm,chmod,whereis注銷及關(guān)機:logout,halt,reboot,exit查看和編輯文本:less,more,cat,vi其他命令:man,startx,history,tar,gzip,echo,bc,wc,cut,grep,sort,head,tail等(?cpba/c把b復(fù)制到a中并取名為ccat后不加任何參數(shù)作用是復(fù)制輸入,以Ctrl+d結(jié)束輸入狀態(tài)(而一般的是以q退出))Linux常用命令

adduser添加新用戶,只能由root來做這件事deluser刪除用戶passwd修改口令(切忌以root單獨敲passwd命令)su切換用戶,root可以切換到任意其他用戶而不需要口令who顯示當(dāng)前登陸用戶id顯示用戶標(biāo)識符用戶管理涉及到的文件帳戶管理/etc/passwd用戶口令管理/etc/shadow用戶組管理/etc/group多用戶管理命令每個進程都有當(dāng)前工作目錄這一屬性。pwd(printworkingdirectory):顯示當(dāng)前工作目錄。cd(changedirectory):改變當(dāng)前工作目錄,參數(shù)可使用相對路徑或絕對路徑mkdir創(chuàng)建新目錄rmdir刪除指定空目錄

(?rm-rdir刪除非空目錄rm*刪除當(dāng)前目錄下所有文件,但目錄不刪除)tree顯示當(dāng)前目錄下的文件系統(tǒng)結(jié)構(gòu)。ls(list):顯示目錄列表,常用選項:-l長格式顯示,-a顯示所有文件,-i顯示索引節(jié)點號,例:

ls–l*.c目錄相關(guān)命令

Linux下的主要文件類型:常規(guī)文件(-):文本文件和二進制文件目錄文件(d):將文件的名稱和它的索引節(jié)點號結(jié)合在一起的一張表(記?。耗夸浺彩俏募?設(shè)備文件(corb):每種I/O設(shè)備對應(yīng)一個設(shè)備文件管道文件(p):主要用于在進程間傳遞數(shù)據(jù),又稱先進先出(FIFO)文件鏈接文件(L):又稱符號鏈接文件,它提供了共享文件的一種方法

文件類型Linux給文件設(shè)定了一定的訪問權(quán)限

Linux對文件的訪問設(shè)定了三級權(quán)限:文件所有者,與文件所有者同組的用戶,其他用戶。對文件的訪問主要是三種處理操作:讀取、寫入和執(zhí)行

訪問權(quán)限和文件模式

cp復(fù)制文件,cpsourcedest,常用選項-rrm刪除文件或目錄,常用選項-f,-rmv移動或重命名現(xiàn)有的文件touch創(chuàng)建空文件或更改文件訪問時間chown改變文件屬主(只能root使用)chmod改變文件權(quán)限。whereis確定文件所在位置。文件相關(guān)命令

logout注銷用戶halt關(guān)機(只能root使用)reboot重啟(只能root使用)exit結(jié)束當(dāng)前進程注銷及關(guān)機命令catmore分頁顯示less功能同more,但更強大,可回滾。建議使用less查看文本catcat是“catenate”的縮寫,意思是連接在一起。它接受多個文件名參數(shù),并把它們復(fù)制到標(biāo)準(zhǔn)輸出。要是沒有參數(shù)將會將輸入作為輸出。catfile1file2查看文本$vifilename進入命令行方式命令行方式下敲i或a轉(zhuǎn)入插入編輯方式插入編輯方式下按Esc回到命令行方式命令行方式下敲“:”,”/”,”?”到末行命令方式配置文件~/.exrc在編輯模式下按ctrl+p匹配單詞vim簡介hjkl移動光標(biāo)x刪除光標(biāo)所在的字母dw從光標(biāo)處刪除至一個單詞的末尾d$從光標(biāo)處刪除至行末dd刪除本行y(yank)復(fù)制,如yw,y2wY將當(dāng)前行拷貝到緩沖區(qū)p(put)將緩沖區(qū)內(nèi)容拷貝至光標(biāo)下一行u(undo)取消上一次操作命令(?刪除掉的內(nèi)容被保存在了緩沖區(qū),直接粘貼即可)命令行方式下的常用命令/word往下搜索word?word往前搜索word:s(substitute)查找及替換,如:1,$s/word/newword/g

:wq寫盤并退出

:q!強行退出

:setnu設(shè)置編輯時顯示行號:setai文本的每一新行均與上行對齊(?永久顯示行號vi.exrc|setnu)末行命令方式下的常用命令正則表達式的元字符集^錨定行的開始^tom$錨定行的結(jié)束tom$

(?^$匹配空行)\<錨定單詞的開始\<cat\>錨定單詞的結(jié)束John\>.匹配一個字符,相當(dāng)于shell中?*代表0個或多個先前字符,ab*[]匹配字符組中的一個字符[Tt]om[x-y]匹配以字符范圍組成的組中的一個字符[^]匹配一個不在范圍內(nèi)的字符\用來轉(zhuǎn)義一個字符man獲取聯(lián)機幫助,如manls,退出按qclear清屏date顯示或設(shè)置系統(tǒng)日期和時間cal顯示萬年歷,cal081992startx啟動X會話,進入X11圖形環(huán)境history顯示歷史命令其他命令echo顯示一行文本,echo“helloworld”tar打包(歸檔),選項-zcvf、解包,-zxvftar–zcvfdir.tar.gzdirtar–zxvfdir.tar.gzgzip,gunzip壓縮、解壓文件(?od-cfile以字符形式顯示不可見的字母)其他命令Unix系統(tǒng)中有很多工具執(zhí)行文本轉(zhuǎn)換功能,這些工具稱為過濾器(Filters)wc計數(shù)函數(shù),常用選項:-l:統(tǒng)計文件的行數(shù);–w:統(tǒng)計單詞個數(shù);–c統(tǒng)計字節(jié)個數(shù)wcfile其他命令uniq刪除連續(xù)重復(fù)行,常用選項:-c重復(fù)數(shù)前置uniqfilehead輸出文本的前十行(默認(rèn)),常用選項:-n指定行數(shù)tail輸出文本的后十行(默認(rèn)),常用選項-n其他命令cut按列或按域截取輸入行中所指出的內(nèi)容(25頁),常用選項:-d制定定界符-f按域截取,例:cut–f1,3-5filecut–d:-f1/etc/passwd其他命令

tr用來從標(biāo)準(zhǔn)輸入中通過替換或刪除操作進行字符轉(zhuǎn)換。tr主要用于刪除文件中控制字符或進行字符轉(zhuǎn)換。(?對原文件沒有影響)

注意:tr只能進行字符的替換、縮減和刪除,不能用來替換字符串。選項–d:刪除字符集中的字符–s:將連續(xù)出現(xiàn)的字符壓縮成一個

-c取字符串中字符集的補集

其他命令Example:catfile|tra-zA-Ztr“ab”“cd”<filetr‘’‘\n’<filetr:‘\t’</etc/passwdtr–s‘\n’<filetr–d‘\n’<filetr–d“hello”<file只要出現(xiàn)“h”、“e”、“l(fā)”、“o”就刪除,并非只刪除hello串其他命令問題:統(tǒng)計名著hamlet中出現(xiàn)頻率最高的前十個單詞。tr–sca-zA-Z‘\n’<hamlet|sort|uniq–c|sort–nr|head其他命令grep全程查找正則表達式并打印(27頁)模式為正則式,若出現(xiàn)元字符用單引號括起來。例:grepJohnbookls–l|grep‘^d’ls–l|grep‘^…….rw’grep‘\.bat’file其他命令C語言編譯系統(tǒng)預(yù)處理器源程序修改后的源程序可重定位的目標(biāo)程序可重定位的目標(biāo)文件庫編譯器匯編器匯編程序連接器可執(zhí)行的目標(biāo)程序

C源程序可以分成若干個模塊

分別進行預(yù)處理、編譯和匯編、形成可重定位的目標(biāo)文件目標(biāo)文件和必要的庫文件連接成一個可執(zhí)行的目標(biāo)文件

gcc和cc是編譯驅(qū)動程序的名字

GCC簡介

GCC常用選項-S,-c,-o例如當(dāng)前有個hello.c源程序:$gcchello.c//生成a.out可執(zhí)行程序$gcc–Shello.c//只編譯,生成hello.s匯編程序$gcc–chello.c//編譯及匯編,但不鏈接,生成hello.o目標(biāo)文件$gcc–ohellohello.c//編譯匯編及鏈接,生成hello可執(zhí)行程序(?運行程序./a.out)多命令行:可將多個命令寫在同一個命令行中,命令之間用分號隔開,如

$pwd;ls-l多行命令:通過轉(zhuǎn)義字符”\”寫多行命令<>shell開啟終端:ctrl+Alt+T(Ubuntu)可通過上下箭頭翻看已執(zhí)行過的命令,或通過history顯示歷史命令可通過Tab鍵匹配文件名用Ctrl+Z掛起進程(可通過fg恢復(fù)其前臺運行)Ctrl+Alt把鼠標(biāo)從虛擬機中釋放字符界面下,通過ALT+F1/F2/F3新建終端tty做普通工作時盡量不使用root帳號bash使用小技巧shell的基本功能

命令的解釋執(zhí)行環(huán)境變量的設(shè)置輸入/輸出重定向shell程序設(shè)計輸入/輸出重定向:UNIX下流的概念

Linux自動為每條執(zhí)行的命令(進程)打開三個文件,分別用于讀取輸入數(shù)據(jù)、發(fā)送輸出數(shù)據(jù)和錯誤信息,這三個文件分別叫標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤文件(stderr)

信息流的標(biāo)準(zhǔn)定義:標(biāo)準(zhǔn)輸入流(stdin):文件描述符0,默認(rèn)為鍵盤.標(biāo)準(zhǔn)輸出流(stdout):文件描述符1,默認(rèn)為顯示器.標(biāo)準(zhǔn)錯誤流(stderr):文件描述符2,默認(rèn)為顯示器.輸入/輸出重定向輸入輸出重定向就是對系統(tǒng)信息流標(biāo)準(zhǔn)定義的修改輸入重定向

<

例:prog<infile輸出重定向

>,>>例:pwd>outfilels–l>>file1例:$prog<infile>outfile錯誤流重定向>&

例:gcchello.c>&log管道線(pipeline)的概念

在命令中利用管道線(|)將命令隔開,實現(xiàn)將一個程序或命令的輸出作為另一個程序或命令的輸入.例:$ls-l|wc-l$ls–l/dev|grepfd$catfile|grephello|wc-l如果不用管道線,該如何實現(xiàn)這一功能?環(huán)境變量是系統(tǒng)預(yù)定義的一些變量,如PATH,LOGNAME等變量,例如:echo$PATH查閱命令env相關(guān)文件:/etc/profile,~/.bash_profile,~/.bash_login

~/.profile<>環(huán)境變量的設(shè)置

shell程序:一種解釋執(zhí)行的腳本(script)語言,類似于DOS下的.bat文件,但功能更強.shell是按行解釋執(zhí)行的,注釋在行首加#,習(xí)慣文件的第一行以”#!/bin/sh”開頭,指明使用哪種解釋器.執(zhí)行方式(三種):$sh<file.sh$shfile.sh首先修改shell程序的權(quán)限為用戶可執(zhí)行,如:$chmod755file.sh

然后在命令行下直接輸入:$./file.sh(未打通路徑,若打通路徑,./不需要)ShellProgrammingshell的變量通常只有字符類型,在shell編程中也會出現(xiàn)一些數(shù)值計算的量,但它們也是基于字符類型完成的。變量的賦值.例:UNIX=SystemV

或UNIX=“SystemVOS”變量的引用:在變量名前加$,如

$UNIX或${UNIX}${UNIX}tm打通路徑:$PATH=$PATH:$HOME//$HOME代表需要添加到路徑變量中的目錄名

(?看打通了沒有echo$PATH)shell變量的使用不同的引號對shell變量產(chǎn)生不同的效果.1)單引號’’:shell將單引號中的內(nèi)容看成純粹的字符串,如:

$file=report$echo’Thetimeis`date`,thefileis$file’結(jié)果:Thetimeis`date`,thefileis$file2)雙引號””:shell對雙引號中的特殊字符進行解釋,如:$echo“Thetimeis`date`,thefileis$file”3)反引號``:對反引號中的內(nèi)容作為shell命令執(zhí)行,如:

$TT=`date`$echo$TTshell變量的使用命令的位置變量在shell中命令的位置變量類似于C語言中argc和argv參數(shù)的功能,它們主要對命令行中各個參數(shù)的位置進行描述。記住$#,$*,$?,$$,$!的定義$#位置參數(shù)的個數(shù)$*用單字符串顯示傳遞參數(shù)$?為前一命令返回的狀態(tài)值(0為正常)$$當(dāng)前shell進程的pid值$!最近訪問的后臺進程的pid值shell變量的使用例echoarg.sh內(nèi)容如下:echo$#forVARin$*doecho$VARdone運行:$echoarg.shfirstsecondthird$0$1$2$3結(jié)果:3

firstsecondthirdshell變量的使用格式:testexpre或[expre]

當(dāng)表達式的值為真時,test命令返回真值0,否則返回假值非0.對文件特性的測試:test–[dfrwxs]file對字符串內(nèi)容的測試:

建議訪問變量使用”$var”的形式對整數(shù)的測試?yán)簒1=“005”,x2=5,注意:$test“$x1”=“$x2”和$test“$x1”-eq“$x2”的區(qū)別test命令的使用if語句(1)無分支條件語句:ifthen(2)二分支條件語句:ifthenelse

(3)多分支條件語句:ifthenelif

<>條件控制語句格式:if[condition]thencommandsfi

例:if[$#=1]thencp$1$HOME/user1fivi$1exit0無分支條件語句格式:if[condition]thentrue-commandselsefalse-commandsfiP77例5.5二分支條件語句格式:if[condition_1]thencommands_1elif[condition_2]thencommands_2elif[condition_3]thencommands_3…….elsecommands_nfi多分支條件語句例5.7:#!/bin/shif[$#-lt3]thenecho“usage:`basename$0`arg1arg2arg3”>&2exit1fiecho“arg1:$1”echo“arg2:$2”echo“arg3:$3”分支條件語句例5.8:testdir#!/bin/shDIREC=$1if[-z`ls–a$DIREC`]thenecho“$DIRECisindeedempty”elseecho“$DIRECisnotempty”fi運行時可輸入:$testdir/home/user1例5.9自己看分支條件語句case語句:casein結(jié)構(gòu)casewordinpattern-1)pat1-list1;;pattern-2)pat2-list2;;……*)default-list;;esac<>條件控制語句例5.10:case$#in1)cat>>$1;;2)cat>>$2<$1;;*)echo“usage:append.sh”;;esac條件控制語句例5.11:#!/bin/shhour=`date+%H`//加號之前有一空格case$hourin0[1-9]|1[01])echo“Goodmorning!”;;1[234567])echo“Goodafternoon!”;;*)echo“Goodevening!”;;esac例5.12:條件控制語句for循環(huán):forindone結(jié)構(gòu)while循環(huán):whiledodone結(jié)構(gòu)until循環(huán):untildodone

<>循環(huán)語句for循環(huán):forindone結(jié)構(gòu)forvariableinlist-of-valuesdocommands……last-commanddone

<>循環(huán)語句例5.13:#!/bin/shcd$HOMEfordirinccworkdoecho“….in$dir”cd$dirforfilein*.[c]dols–l$filedonecd..done循環(huán)語句while循環(huán):while-do-done結(jié)構(gòu)只要循環(huán)條件為真就繼續(xù)循環(huán)下去。while[condition]docommands……last-commanddone例5.14<>循環(huán)語句until循環(huán):until-do-done結(jié)構(gòu)只要循環(huán)條件為假(非0值)就繼續(xù)循環(huán)下去。until[condition]docommands……last-commanddone另外,和C語言一樣,break和continue語句也可以使用。<>循環(huán)語句例5.15uonuntilwho|grep“$1”>/dev/nulldosleep30doneecho“07\07$1isloggedon.”exit0運行:$uonlili&循環(huán)語句expr是對shell變量進行算術(shù)運算的操作.例:$count=0$count=$count+1$echo$count顯示為0+1$count=`expr$count+1`$echo$count顯示為1expr命令在程序中顯示錯誤信息

echo“usage:``basename$0`arg1arg2”>&2將不必要的信息送入系統(tǒng)垃圾文件/dev/null(黑洞)中例5.17#!/bin/shifcpmyfilemyfile.bak>/dev/null2>&1thenecho“goodcopy”elseecho“`basename$0`:errorcouldnotcopythefiles”>&2fishell編程中常用的其他語句在程序運行中讀取標(biāo)準(zhǔn)輸入流信息

read[word1][word2]…[rest]注意:read語句每次接受輸入以換行(回車)結(jié)束,將輸入按照IFS(默認(rèn)為空格,Tab,回車)定義的分隔符分成不同的域。見例5.18shell編程中常用的其他語句例5.18read_test#!/bin/shecho”givemealongsentence:”readword1word2restecho–e“$word1\n$word2\n$rest”echo”endofmyact.”

運行后輸入:let’stestthereadcommand.輸出:let’stestthereadcommand.endofmyactshell編程中常用的其他語句交互式調(diào)試?yán)枚啻翱诙噙M程邊調(diào)試、邊編輯用shell程序提供的跟蹤功能進行調(diào)試

-v–x選項<>shell程序的調(diào)試方法

假設(shè)score.txt文件中保存兩個班級的同學(xué)的數(shù)學(xué)成績,請編寫一個shell程序計算每個班級的學(xué)生人數(shù)和平均分。score.txt內(nèi)容如下:wangpin:class1:87wubo:class2:96zhanghua:class1:65xiaonong:class2:88jiangbo:class2:93……shell程序舉例#!/bin/shSCORE1=0SCORE2=0NUMBER1=0NUMBER2=0SAVEDIFS=$IFSIFS=:INFILE=score.txtshell程序舉例whilereadNAMECLASSSCOREdocase$CLASSinclass1)NUMBER1=`expr$NUMBER1+1`SCORE1=`expr$SCORE1+$SCORE`;;class2)NUMBER2=`expr$NUMBER2+1`SCORE2=`expr$SCORE2+$SCORE`;;*);;esacdone<$INFILEshell程序舉例SCORE1=$(echo"scale=2;$SCORE1/$NUMBER1"|bc)SCORE2=$(echo"scale=2;$SCORE2/$NUMBER2"|bc)echo"classstudentnumberaveragescore"echo"-----------------------------------------"echo"1$NUMBER1$SCORE1"echo"2$NUMBER2$SCORE2"shell程序舉例提示:windows系統(tǒng)中敲入一個回車,會生成兩個字符:\r\n,即回車換行(CRLF:carriagereturn/linefeed),而linux下只會生成一個\n.所以要是windows記事本里敲入的文本傳到linux下面使用,應(yīng)把\r字符刪除:$catfile|tr–d‘\r’>file.bakshell程序舉例并行與并發(fā)現(xiàn)代計算機系統(tǒng)提供多道程序運行環(huán)境,這種環(huán)境可以由多處理器結(jié)構(gòu)構(gòu)成,也可以由單處理器結(jié)構(gòu)構(gòu)成。并行(Parallelism):多個程序在不同的處理器上同時運行。并發(fā)(Concurrency):多個程序在單個處理器上按照一定規(guī)則進行切換,輪流運行。由于切換迅速,給用戶的感覺是每個用戶獨占自己的cpu,宏觀上面看起來并行。在操作系統(tǒng)中引入進程的目的,就是為了使多個程序能夠并發(fā)執(zhí)行。進程的概念進程(process)的概念:進程就是執(zhí)行中的程序,或者說是程序的一次執(zhí)行。程序是一個靜態(tài)的概念,進程是一個動態(tài)的概念進程是操作系統(tǒng)資源分配和調(diào)度的基本單位。進程介紹-程序和進程

Linux進程狀態(tài)Linux下的進程狀態(tài):TASK_RUNNING(運行,R):進程是可執(zhí)行的;它或者正在執(zhí)行,或者在運行隊列中等待執(zhí)行。TASK_INTERRUPTIBLE(淺度睡眠,S):進程正在睡眠,等待某些條件的達成。一旦這些條件達成,內(nèi)核就會把進程狀態(tài)設(shè)置為運行。處于此狀態(tài)的進程也會因為接收到信號而提前被喚醒并投入運行。TASK_UNINTERRUPTIBLE(深度睡眠,D):除了不會因為接收到信號而被喚醒,這個狀態(tài)與可打斷狀態(tài)相同。Linux進程狀態(tài)Linux下的進程狀態(tài):TASK_ZOMBIE(僵尸,Z):該進程已經(jīng)結(jié)束,但其父進程還沒有調(diào)用wait4()系統(tǒng)調(diào)用回收該子進程的殘骸。TASK_STOPPED(停止,T):進程停止執(zhí)行;進程沒有投入運行也不能投入運行。進程控制塊-Linux進程狀態(tài)及轉(zhuǎn)換fork()TASK_RUNNING就緒TASK_INTERRUPTIBLE淺度睡眠TASK_UNINTERRUPTIBLE深度睡眠TASK_STOPPED暫停TASK_ZOMBIE僵死占有CPU執(zhí)行do_exit()schedule()ptrace()schedule()時間片耗盡等待資源到位sleep_on()schedule()等待資源到位interruptible_sleep_on()schedule()資源到位wake_up_interruptible()或收到信號wake_up()資源到位wake_up()收到信號SIGCONTwake_up()進程管理

ps(processsnapshot):查看進程狀態(tài),常用選項-ef,-auxtop:實時顯示進程信息pstree:顯示進程樹進程管理前臺進程:前臺進程控制著終端,當(dāng)進程沒有結(jié)束時,你不能執(zhí)行其他命令。Ctrl+Z:掛起(suspend)前臺進程,使進程處于停止?fàn)顟B(tài)(stopped)Ctrl+C:終止前臺進程后臺進程:后臺進程以較低的優(yōu)先級運行,那些執(zhí)行無需用戶干預(yù)而且很費時的任務(wù)很適合在后臺運行,如編譯、壓縮解壓等任務(wù)。$./a.out&[1]1315jobidpid被掛起或在后臺運行的進程,也稱為作業(yè)(job)

進程管理jobs:查看作業(yè)狀態(tài),當(dāng)前進程用+號表示,而前一個進程用-號表示。當(dāng)有多個被掛起的進程,不帶參數(shù)時,fg命令會把當(dāng)前進程帶到前臺,而bg命令把當(dāng)前進程恢復(fù)到后臺運行。語法:fg[%jobid]作用:恢復(fù)作業(yè)號為jobid的前臺進程的執(zhí)行或把它從后臺轉(zhuǎn)移到前臺執(zhí)行。進程管理提供各種服務(wù)的后臺進程稱為守護進程,也稱為精靈進程(daemon),如提供http服務(wù)的httpd進程。Kill殺死一個進程,killpid一個用戶可以殺死自己的進程,但不能殺死別人的進程.root可以殺死任何進程終止后臺進程有兩種方法:1.killpid2.用fg命令把它轉(zhuǎn)移到前臺,然后按Ctrl+C系統(tǒng)調(diào)用系統(tǒng)調(diào)用的概念

系統(tǒng)調(diào)用(systemcall),顧名思義,說的是操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口。從邏輯上來說,系統(tǒng)調(diào)用可被看成是一個內(nèi)核與用戶空間程序交互的接口——它好比一個中間人,把用戶進程的請求傳達給內(nèi)核,待內(nèi)核把請求處理完畢后再將處理結(jié)果送回給用戶空間。(?更加底層,緩沖)進程相關(guān)的系統(tǒng)調(diào)用進程的創(chuàng)建:fork格式:pid=fork()此系統(tǒng)調(diào)用生成一個子進程,該子進程繼承了父進程fork()之后的代碼(其實質(zhì)是繼承了父進程的IP寄存器的內(nèi)容),fork返回給子進程0值,返回給父進程為子進程的進程號(大于0),故可通過fork的返回值區(qū)分父子進程。fork之后父子進程并發(fā)執(zhí)行。fork示例#include<stdio.h>main(){intpid;

/*此時僅有一個進程*/

printf(“PIDbeforefork():%d\n”,(int)getpid());

pid=fork();

/*此時已經(jīng)有兩個進程在同時運行*/

if(pid<0)printf("errorinfork!"); elseif(pid==0) printf("Iamthechildprocess,myprocessIDis%d\n",getpid()); else printf("Iamtheparentprocess,myprocessIDis%d\n",getpid());printf(“helloworld.\n”);}

(?必考)fork示例編譯并運行這個程序:$gcc-ofork_testfork_test.c$./fork_test

PIDbeforefork():1991Iamtheparentprocess,myprocessIDis1991Iamthechildprocess,myprocessIDis1992

helloworld.hellowold.再運行一遍,輸出結(jié)果可能不同。讀者考慮一下為什么?進程相關(guān)的系統(tǒng)調(diào)用exec我們經(jīng)常需要父子進程執(zhí)行不同的任務(wù),僅用fork系統(tǒng)調(diào)用是不夠的。exec可指定一個可執(zhí)行程序的副本將調(diào)用進程的正文段和數(shù)據(jù)段進行覆蓋,從而使子進程執(zhí)行與父進程不同的程序代碼。exec有六種使用方式,常用的有execl,execv。shell執(zhí)行一個外部命令時就是通過創(chuàng)建一個子進程并讓子進程執(zhí)行命令。execl:表示指令用長格式調(diào)用execv:可利用參數(shù)argv指針數(shù)組運行參數(shù)execl示例

#include<stdio.h>main(){printf(“one\n”);execl(“/bin/ls”,”ls”,”-l”,NULL);printf(“two\n”);perror(“execerror”);return0;}

(?必考)execv示例

#include<stdio.h>intmain(intargc,char*argv[]){printf(“one\n”);execv(“pathname”,argv[0],argv[1],NULL);printf(“two\n”);perror(“execerror”);return0;}

進程相關(guān)的系統(tǒng)調(diào)用exit進程可通過系統(tǒng)調(diào)用exit終止自己的運行(自殺),使進程處于僵尸狀態(tài)。進程在自殺的時候可以留下遺言。這時被終止的進程會釋放他所占有的資源,如關(guān)閉打開的文件,釋放進程上下文占有的內(nèi)存等并把其所有的子進程托付給init進程。處于僵死的進程只留下一個殘骸(PCB),等待父進程為其處理后事。格式:exit(status)其中status是一個整數(shù),它可以作為進程消亡時的留言狀態(tài)傳遞給父進程。exit和return的區(qū)別系統(tǒng)調(diào)用exit和函數(shù)return執(zhí)行效果相似,但運行機制是不相同的。return是函數(shù)結(jié)束的返回,它可以把一些值返回給調(diào)用函數(shù),而且調(diào)用函數(shù)和被調(diào)用函數(shù)也可能很大,但它們可以是在一個進程中執(zhí)行的程序。而系統(tǒng)調(diào)用exit是進程的終止,它所完成的是將子進程的返回狀態(tài)傳遞給父進程,因此它們是兩個層面上的概念,在使用中應(yīng)加以區(qū)分。

進程相關(guān)的系統(tǒng)調(diào)用wait進程可以通過wait與正在執(zhí)行的子進程終止點同步pid=wait(stat-addr)返回值pid是終止進程的進程號,參數(shù)stat-addr是子進程結(jié)束時返回的狀態(tài)信息存放的地址。假設(shè)我們只對進程的同步感興趣,而對進程返回的狀態(tài)及終止進程的pid不感興趣的話,可以簡寫成wait(0).例8.3進程的系統(tǒng)調(diào)用Fork()-父親克隆一個兒子。執(zhí)行fork()之后,兵分兩路,兩個進程并發(fā)執(zhí)行。Exec()-新進程脫胎換骨,離家獨立,開始了獨立工作的職業(yè)生涯。Wait()-等待不僅僅是阻塞自己,還準(zhǔn)備對僵死的子進程進行善后處理。Exit()-終止進程,把進程的狀態(tài)置為“僵死”,并把其所有的子進程都托付給init進程,最后調(diào)用schedule()函數(shù),選擇一個新的進程運行。進程的一生隨著一句fork,一個新進程呱呱落地,但這時它只是老進程的一個克隆。然后,隨著exec,新進程脫胎換骨,離家獨立,開始了獨立工作的職業(yè)生涯。人有生老病死,進程也一樣,它可以是自然死亡,即運行到main函數(shù)的最后一個"}",從容地離我們而去;也可以是中途退場,退場有2種方式,一種是調(diào)用exit函數(shù),一種是在main函數(shù)內(nèi)使用return,無論哪一種方式,它都可以留下留言,放在返回值里保留下來;甚至它還可能被謀殺,被其它進程通過另外一些方式結(jié)束它的生命。進程死掉以后,會留下一個空殼,wait站好最后一班崗,打掃戰(zhàn)場,使其最終歸于無形。這就是進程完整的一生。文件描述符每個進程可以打開多個文件,每個進程用一個小的非負(fù)整數(shù)來表示其打開的每個文件,這個整數(shù)就是文件描述符(fd)。任何時候?qū)ξ募妮斎?輸出都是通過文件描述符標(biāo)示文件。文件描述符類似于標(biāo)準(zhǔn)庫中的文件指針或MS-DOS中的文件句柄。因為大多數(shù)的輸入/輸出都是通過鍵盤和顯示器來實現(xiàn)的,為了方便起見,當(dāng)shell運行一個程序的時候,它將自動打開三個文件,對應(yīng)的文件描述符分別為0、1、2,一次表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤。文件相關(guān)的系統(tǒng)調(diào)用creat創(chuàng)建一個空文件,格式:fd=creat(name,Pmode),例如:fd=creat(“/usr/abc”,0777)每個進程有一個掩碼umask,被創(chuàng)建文件的權(quán)限為(~umask)&Pmode

umaskisabuiltincommand.link用于建立文件之間的硬鏈接,格式:status=link(name1,name2)unlink

刪除一個鏈接文件status=unlink(name)文件的打開和關(guān)閉open打開一個已存在的文件,格式:fd=open(name,rwmode[,pmode]);rwmode為文件被打開的模式。該函數(shù)正常調(diào)用返回的fd大于等于3close

關(guān)閉一個被打開的文件,格式:status=close(fd);read/write對文件的讀寫,格式:n=read(fd,buffer,size);n=write(fd,buffer,size);buffer是指向讀/寫緩沖區(qū)的指針,n是一次讀/寫操作的返回字節(jié)數(shù)文件的讀寫main(intargc,char*argv[]){intfd1,fd2,n;charbuf[512];if(argc<=2){printf("youforgottheenterafilename\n");exit(1);}fd1=open(argv[1],0);fd2=creat(argv[2],0644);while((n=read(fd1,buf,512))>0)write(fd2,buf,n);close(fd1);close(fd2);}拷貝的實現(xiàn)lseek(?必考)改變文件指針?biāo)傅奈恢?,格式:newpos=lseek(fd,offset,origin);tell捕獲當(dāng)前文件指針的位置,格式:Pos=tell(fd);Linux中把tell的功能加進lseek中,取消了telllockf:對文件記錄鎖定,格式:status=lockf(fd,func,size)文件的讀寫#include<sys/types.h>#include<unistd.h>#include<sys/stat.h>#include<fcntl.h>charbuf1[]="abcdefghij";charbuf2[]="ABCDEFGHIJ";main(){intfd;fd=creat("file.hole",777);write(fd,buf1,10);lseek(fd,40,SEEK_SET);write(fd,buf2,10);exit(0);}

(?考類似)例7.3創(chuàng)建一個空洞文件dup(fd)(?必考)復(fù)制文件描述符fd至最小未使用的文件描述符main(){intfd=creat(“outfile”,0644);close(1);dup(fd);close(fd);execl(“/bin/ls”,”ls”,”-l”,0);}系統(tǒng)調(diào)用dupstat(?相當(dāng)于ls的功能)系統(tǒng)調(diào)用stat以文件名作為參數(shù),返回文件的i結(jié)點中的所有信息;若出錯,則返回-1.如下所示:intstat(char*name,structstat*stbuf)它用文件name的i結(jié)點信息填充結(jié)構(gòu)stbuf。頭文件<sys/stat.h>中包含了描述stat的返回值的結(jié)構(gòu)。如下:系統(tǒng)調(diào)用statstructstat{/*由stat返回的i結(jié)點信息*/dev_tst_dev;/*i結(jié)點設(shè)備*/ino_tst_ino;/*i結(jié)點編號*/shortst_mode;/*模式位*/shortst_nlink;/*文件的總鏈接數(shù)*/shortst_uid;/*所有者的用戶id*/shortst_gid;/*所有者的組id*/dev_tst_rdev;/*用于特殊文件*/off_tst_size;/*用字符數(shù)表示的文件長度*/

time_tst_atime;/*上一次訪問的時間*/time_tst_mtime;/*上一次修改的時間*/time_tst_ctime;/*上一次改變i結(jié)點的時間*/};系統(tǒng)調(diào)用statst_mode項包含了描述文件的一系列標(biāo)志,這些在<sys/stat.h>中定義。文件類型的有關(guān)部分為:#defineS_IFMT0160000/*文件的類型*/#defineS_IFDIR0040000/*目錄*/#defineS_IFCHR0020000/*特殊字符*/#defineS_IFBLK0060000/*特殊塊*/#defineS_IFREG0100000/*普通*/系統(tǒng)調(diào)用stat#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>intmain(intargc,char**argv){structstatstbuf;stat(argv[1],&stbuf);printf("%s%8ld",argv[1],stbuf.st_size);if((stbuf.st_mode&S_IFMT)==S_IFDIR)printf("thisisadirectory.\n");if((stbuf.st_mode&S_IFMT)==S_IFREG)printf("thisisaregularfile.\n");return0;}系統(tǒng)調(diào)用stat

UNIX文件系統(tǒng)是UNIX成功的關(guān)鍵。其特點主要表現(xiàn)為以下幾點:

目錄結(jié)構(gòu)采用樹形層次結(jié)構(gòu)可安裝拆卸的文件系統(tǒng)文件是無結(jié)構(gòu)的字符流式文件把外部設(shè)備和文件目錄作為文件處理。UNIX文件系統(tǒng)特點lseek改變文件指針?biāo)傅奈恢?,格式:newpos=lseek(fd,offset,origin);(?必考)文件的隨機存取這6個系統(tǒng)調(diào)用(creat,open,read,write,lseek,close)通常稱為unbufferedI/O(相對于標(biāo)準(zhǔn)I/O庫stdio.h中提供的函數(shù)).不同于這些系統(tǒng)調(diào)用操作的是文件描述符,標(biāo)準(zhǔn)I/O庫中采用流(stream)的概念.當(dāng)我們打開一個流,fopen返回指向文件對象(FILE)的指針.這個文件對象包含了標(biāo)準(zhǔn)I/O庫用于管理流的所有信息:用于實際I/O的文件描述符;一個指向緩沖區(qū)的指針;緩沖區(qū)的大小,等等.FILE結(jié)構(gòu)的定義可見stdio.h.

一個分區(qū)創(chuàng)建一個文件系統(tǒng)。Unix的文件系統(tǒng)通常由4部分構(gòu)成:引導(dǎo)塊超級塊索引節(jié)點表數(shù)據(jù)區(qū)引導(dǎo)塊(bootblock):處于文件系統(tǒng)的開始部分(0#塊),其中存放操作系統(tǒng)的引導(dǎo)信息或系統(tǒng)啟動代碼。顯然在操作系統(tǒng)管理的多個文件系統(tǒng)中,只有具有引導(dǎo)能力的文件系統(tǒng)的引導(dǎo)塊中裝有代碼,其余文件系統(tǒng)此塊均為空。超級塊(superblock):此塊(1#塊)中存放文件系統(tǒng)中的文件和目錄在磁盤上靜態(tài)分布的描述信息,超級塊對文件系統(tǒng)的維護很重要。索引節(jié)點表(inodelist):見下一頁數(shù)據(jù)區(qū)(dataarea):存放本文件系統(tǒng)中文件數(shù)據(jù)和目錄文件數(shù)據(jù)。文件系統(tǒng)中的文件有一些屬性信息,比如創(chuàng)建時間、修改時間、文件大小、訪問權(quán)限等。為了便于管理,Unix將每個文件的這些信息存放在其對應(yīng)的索引節(jié)點(inode)中,每個文件唯一對應(yīng)一個索引節(jié)點。索引節(jié)點是Unix中一個很重要的概念。索引節(jié)點也稱i節(jié)點.每個索引節(jié)點在索引節(jié)點表中有一個編號,稱為索引節(jié)點號。ls命令的i選項可以查看文件的索引節(jié)點號。目錄(directory)的實現(xiàn)目錄是一種特殊的文件。目錄的功能是實現(xiàn)文件名到文件地址的映射。目錄中的一項稱為目錄項(dentry,directoryentry)。所以,文件名和地址這兩項在目錄中是必不可少的。而文件的其他屬性是否放到目錄中,不同的操作系統(tǒng)有不同的做法。

下圖是一個MS-DOS的目錄項,它總共32個字節(jié)。目錄文件名8擴展名31102224屬性保留時間日期第一塊號長度目錄的實現(xiàn)UNIX中采用的目錄結(jié)構(gòu)非常簡單,如圖,每個目錄項占16個字節(jié),其中只包含文件名及其索引節(jié)點號。有關(guān)文件類型、長度、時間、所有者和磁盤地址等信息都放到索引節(jié)點(inode,indexnode)中,inode的引入為文件共享提供了便利。

目錄索引節(jié)點號索引節(jié)點hello.c的內(nèi)容目錄項磁盤驅(qū)動器文件名142擁有者、創(chuàng)建時間、修改時間、訪問權(quán)限,鏈接數(shù)等屬性磁盤地址注意:目錄也是一個文件,可以像普通文件一樣通過less命令查看Unix采用inode的好處?(?必考)優(yōu)點1.加快檢索文件的速度存取文件信息時要檢索文件目錄。如果把有關(guān)文件的全部說明信息都存放在相應(yīng)的目錄項中,勢必使每個目錄的規(guī)模龐大,而在進行檢索時,又要把目錄的全部內(nèi)容都讀入內(nèi)存查找,這顯然浪費了大量的I/O傳送時間。

Unix的目錄項只包含文件名和對應(yīng)的inode編號,這樣大大減少了系統(tǒng)各級目錄的規(guī)模。

Unix采用inode的好處?優(yōu)點2.采用inode為文件共享提供了便利由于Unix系統(tǒng)把文件名和文件的其他信息分開存放:文件名字存放在目錄項中,而文件的其他信息存放在索引節(jié)點中,這樣為多個邏輯文件名共享同一個物理文件提供了便利。

鏈接的目的是為了文件共享??梢杂面溄用頻n(Link)對一個已存在的文件再建立一個新的鏈接,而不復(fù)制文件的內(nèi)容硬鏈接(hardlink):讓一個文件對應(yīng)一個或多個文件名,或者說把我們使用的文件名和文件系統(tǒng)使用的節(jié)點號鏈接起來,這些文件名可以在同一目錄或不同目錄軟鏈接(也叫符號鏈接,symboliclink):是一種特殊的文件,這種文件包含了另一個文件的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論