




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實驗一Linux系統(tǒng)安裝及初級命令熟實驗類型:課程設(shè)計passwd,首先需要的光盤鏡像,如果你喜歡刻盤安裝那就desktop版本刻盤安裝,這里的是使用ubuntu-7.04-alternate-i386.iso進(jìn)行硬盤安裝,所以alternate版,另外最近的人比較多,更使用bt。如果你刻盤安裝,那么把刻好的盤直接放到光驅(qū)中,desktop版本啟動之后可以進(jìn)入livecdinstall進(jìn)行安裝,按提示一到第5步)先好光盤鏡像,放在某個分區(qū)根 下(我這里放置在windows的D盤下)然 (Ubuntu在硬盤上用分區(qū)魔術(shù)師之類的分出來一個ext3的分區(qū),作為linux根分區(qū),分出一個大小為內(nèi)存2倍的swap分區(qū),作為linux的虛擬內(nèi)存。grubgrub就直接跳過這步。如果沒有g(shù)rub,下載矮人dos工具箱。地址 然后一個grubfordos,將里面的grub.exe等東西解壓出來(圖省事,也解壓并放到D盤根下)(如果你有軟盤的話,可以把grubfordos解壓到軟盤里使用軟盤引這時運(yùn)行矮人dos工具箱,進(jìn)入dos,Dgrub.exe啟動grub進(jìn)入grub,按c鍵調(diào)出命令模式kernel(hd0,2)/vmlinuzroot=/dev/ram0ramdisk_size=32000注意:命令里面的(hd0,2)不是,要看你文件放置的分區(qū)和 確定的話,可以先輸入find/ubuntu-7.04-alternate-i386.iso,出現(xiàn)的結(jié)果(會出現(xiàn)(hd0,X)一類的東西)就是上面(hd0,2)應(yīng)該改成的東西了 問你是否安裝ubuntu-desktop,當(dāng)然要用空格把它選上,然后按tab切換到“確定”按gnome啟動......[root@RH5Server[root@RH5Server其中,root表示當(dāng)前的用戶為“root”,需要說明的是,在linux系統(tǒng)中,root用戶是系統(tǒng)管理員用戶,其他為一般用戶;RH5Server~表示當(dāng)前所在的,此處表示位于當(dāng)前用戶的主下;#表示超級用戶令提示符,所謂命令提示符,就是提示#gedit#gedit需要說明的是,geditlinuxetc有用戶指定了主;在登錄時使用的s程序名稱等。該文件還保存了用戶口令;給 域 s戶,那么就查看name字段中有沒有aifi。#adduser如果沒有,那么繼續(xù)下面的操作,如果有,那么更改你的用戶名,并重復(fù)上面的步#adduser也就是在第一字段是否增加了一行以用戶名aifi開頭的記錄。ChangingpasswordforChangingpasswordforuseraifiNewUNIXpassword:$passwd 繼續(xù),輸入完成后單擊回車,出現(xiàn)以下提示:RetypenewUNIXpassword:passwd:allauthenticationtokensupdatedpasswd:allauthenticationtokensupdated在設(shè)置的實驗中,需要說明兩個問題:第一,paswd命令不僅可以用于的設(shè)置,還可以用于的修改;第二是,如果你當(dāng)前處于普通用戶,那么可以通過直接運(yùn)行assd于inux的會會經(jīng)過系統(tǒng)的嚴(yán)格驗證,驗證的機(jī)制除了/ec/lgin.dfs里頭規(guī)定的最小字個數(shù)外還受/etc/p.d/pasd這個AM驗,般說,入最要符合的要求:不能與賬號相同;盡量不要選用字典里面會出現(xiàn)的字串;8#su3、創(chuàng)建了用戶名和,這樣就可以登錄到的賬戶下了,在命令提示符后鍵入:#su [aifi@RH5Server 答案是who命令。如果您現(xiàn)在是使用單人單機(jī),能否練習(xí)這個命令呢?還是可以的。提到過,linux系統(tǒng)默認(rèn)有6個虛擬終端機(jī),可以用[Ctrl+Alt+F1]、[Ctrl+Alt+F2]、[Ctrl+Alt+F3]、[Ctrl+Alt+F4]、[Ctrl+Alt+F5]、[Ctrl+Alt+F6]分別把這幾個終端按出來,那么您就可以從各個虛擬終端機(jī)登陸,然后用who命令查看是不是能777777那么你可以使用whoami命令查看當(dāng)前用戶是誰。答案可以以用hton命有,條須運(yùn)行在你就是超級用戶時,并且您是在單人單工使用時。具體命令有以下幾種類型,您shutdown–hnowShutdown–h+0shutdown–h+30//30shutdown–h10saveyourdatanowsaveyourdatanow”信息給大家,大家不但會收到此條消息,還會收到系統(tǒng)的主動通知:thesystemisgoingdownforsystemhaltin10minutes!回車RETURNCONTROL-mCTL-m,它表示輸入行結(jié)束能,因為有時這顯得比較麻煩,在大部分終端上,退格和Tab等都有單獨(dú)的鍵。此外還有兩個特殊鍵,一個是DELETE鍵,另一個是BREAK鍵。大多數(shù)LINUX系統(tǒng)中,DELETE鍵表示立即終止程序。在有些系統(tǒng)里,也用CTL-c終止程序。一般說來,BREAK鍵與DELETE鍵、CTL-c的功能基本相同。每頁使用手冊頁都傳統(tǒng)地分成幾個組成段;各種命令的文檔也分成幾個組成段。表41、#man命令 比如知道ls命令的用法,就可以用下面令 [aifi@RH5Server~]$man ctrl+FEntermanq22[aifi@RH5Server~]$33得幫助,比如知道ls最簡單的用法。[aifi@RH5Server[aifi@RH5Server~]$ls--lessmore[aifi@RH5Server[aifi@RH5Server~]$ls--help|[aifi@RH5Server~]$ls[aifi@RH5Server~]$ls--help|linuxvi編輯器,使用它的好處是幾乎每一個版本的linux下使用,需要一些基本令操作方式。也可以選擇使用pico,joe,jove,mc編輯器,像是Gedit,Kate等,或是使用KDevelop,它是在linux下的XWindow下執(zhí)行的C/C++實驗二文件 操實驗類型:課程設(shè)計 使用ls命令的不同命令選項,來查看文件與 Linux上運(yùn)行的大多數(shù)程序則是機(jī)器操作碼文件。每當(dāng)執(zhí)行一條Linux命令時,就是告訴計算機(jī)去執(zhí)行某個文件或某組文件中令,Linux系統(tǒng)中,除了通常意義上的文件外,每個物理實體也都是以文件的形式出現(xiàn)的。例如像磁盤、、終端等,可以像處理普通文件那樣來打開、讀寫和關(guān)閉它加特定的結(jié)構(gòu)。例如,在文本文件中,稱為新行(newline)的特殊ASCII字符被用于分隔文統(tǒng)一元含件。 像桌文屜放著各種文件事實上Linux系統(tǒng)中每個件都是含在某個 中的這樣的排保持文組并了尋一文花時試下果中千個文件都在起,Linux系統(tǒng)就花很長去搜索所的文件然后才找到某特文如文別在的 中則告統(tǒng)件的 ,系只該 下十件找的件而提系效。在Linux系統(tǒng)中 但它具有文件名列表和有關(guān)這些文件的其它信息。由于也是一種文件,因此也可以把一個放到另一個中。這有助于作為整體解釋文件系統(tǒng),因為系統(tǒng)實際上是和為了區(qū)別各個文件,必須給每個文件取個名字。在Linux系統(tǒng)中,一個好的文件名由也不應(yīng)該包含任何對s有特定含義的字符,這些特定字符包括:Linux系統(tǒng)是區(qū)分字符的大小寫的,因此名為README的文件與名為readme的文件是也可以使用多個擴(kuò)展名。有些擴(kuò)展名具有一些特定的含義,例如擴(kuò)展名為.c的文件通常表C語言的源程序。但擴(kuò)展名的這些含義是用戶們一致同意的約定,而不是由系統(tǒng)的特性但不同版本的文件名長度的限制上并不是一致的。LinuxLinux25614由于也是一種文件,因此名規(guī)則與文件名名規(guī)則是一樣的Linux的文件系統(tǒng)是一個包含文件和的層次結(jié)構(gòu),它像一棵倒掛的樹,因此被稱為樹。樹的最頂端只有一個,被稱為根(root)。根以斜線字符(/) 和文件。下圖顯示了一個典型的Linux文件系統(tǒng)的部分結(jié)構(gòu)。要顯示Linux系統(tǒng)上的所有文件和 ,jame、john和sjp是home。相應(yīng)地,/是bindev、lib、home和usrLinux系統(tǒng)中的每個文件和 所在的絕對路徑名為/home/sjp/mbox,而文件note所有的絕對路 名) 表示當(dāng) 下的 下除了用點號來表示當(dāng)前外,系統(tǒng)還用兩個點號(..)來表示上一層。例如,如果當(dāng)前是mbox,則“.mbox,“..sjp。要指定note文件,則可以寫成./../note,表示當(dāng)前(mbox)的上一層(sjp)note/binLinuxbin這個名暗示著存放的是二進(jìn)制文件,但該中的可執(zhí)行程序并不一定都是二進(jìn)制文件。事實上,/bin中幾個較小的可執(zhí)行程序是s 。關(guān)于s /bootLinux/dev包含有硬件設(shè)備的文件。Linux支持的每種硬件設(shè)備都對應(yīng)著該中的一個文件。例如,5.25360KB的低密軟驅(qū)對應(yīng)著該中的fd0D3603.5英寸1.44MB的高密軟驅(qū)對應(yīng)著該中的fd0H1440文件。/etc的用于管理Linux系統(tǒng)的文件和工具,其中還含有像passwd和 含有C編譯程序所需要的函數(shù)庫。即使不用C編譯程序,這個 中含有Linux所需要的大部分命令,且這些命令相對來說不是很常用。此外,許多特殊用途令被分別存放在不同的 中。例如,與XWindows有關(guān)令通 用于存放應(yīng)用程序產(chǎn)生的臨時文件。產(chǎn)生這些臨時文件的應(yīng)用程序在執(zhí)行結(jié)束之后通常會做些清理工作,從而刪除它所產(chǎn)生的臨時文件。此時,Linux也會周期性地自 含有相當(dāng)多而雜的內(nèi)容,其中包含XWindows系統(tǒng)的可執(zhí)行程序、函數(shù)庫以及等。此外,/usr中的許多內(nèi)容是/var 專門用來保存lp打印系統(tǒng)cron守護(hù)程序和UUCP通信系統(tǒng)使用的全部過渡數(shù)據(jù)。將要 使用pwd命令,確認(rèn)你現(xiàn)在正處在自己的主 $命令pwd(printworkingdirectory)可以告訴用戶目前是在哪個 $ cdcddirName],用于變換工作至dirNamedirName表示法可為絕對路徑或相對路徑。若名稱省略,則變換至使用者的homedirectory也就是剛登錄時所在的)。另外,"~"也表示為homedirectory的意思,"."則是表示目前所在的,".."則表示目前位置的上一層。以下例子示范命令cd的使用。跳到$cd跳到自己的home$cd~或$ $cd $cd使用pwd命令確認(rèn)你的當(dāng)前 ,這可以使用ls命令來完成。ls命令有非常多的選項,用來修正ls命令的行為,以便滿足用戶的不同需求。 $$ 在上面的例子中,ls的輸出是分成幾欄的,每行顯示幾個文件名。這個命令只只給出標(biāo)志的ls命令,如:$ls-l。$ls總計131110ls命令沒有任何輸出,并不表示該中沒有文件和子,因為通常情ls命令并不顯示隱含文件(或),即以(.)開關(guān)的文件(或)。要顯示隱含文件,可以使用-als列出中所有的文件和子,而不管它是不是$ls. ,因而‖ls–a‖命令問題有輸出內(nèi)容的。 下的文件,可以用‖ls-R‖命令實 $ls$cd$cd$ls在你的用戶主中創(chuàng)建一個名為mydir的新。然后調(diào)用長列表命令來查看/home/用戶名mydir和/home/用戶名(只查看文件的信息)。mkdir命令來完成的。該命令的語法形式為:使用方式:mkdir[-p]dirNamedirName之子。其中,參數(shù)-p確保名稱存在,不存在的就建一個。在工 下,建立一個名為AAA的 $mkdir 中,建立一個名為Test的子 建立一個(注:本例若不加-p,且原本BBB $mkdir-p$mkdir$ls-$cd$ls- 中創(chuàng)建一個名為mydir的新 $mkdir$ls-$cd$ls- touch的使用方式為touch[-acfm][-rreference-file][--file=reference-file][-tMMDDhhmm[[CC]YY][.ssdtimedate=timetime={atime,access,use,mtime,modify}][--no-create][--help][--version]file1[file2...]。touch命令用于改變的時間記錄。ls-l其中,touch命令的參數(shù)為:a改變的時間記錄。m改變的修改時間記錄。c假如目的不存在,不會建立新的。與--no-create的效果一樣。f不使用,是為了與其它unix系統(tǒng)的兼容性而保留。r使用參考文件的時間記錄,與--file的效果一樣。d設(shè)定時間與日期,可以使用各種不同的格式。t設(shè)定的時間記錄,格式與date指令相同。--no-create不會建立新。--help列出指令格式。--version列本信息。$touchfiletouchfile1$touch-c-t05061803$touch-c-t200005061803$touch-c-t05061803$touch-c-t200005061803$touch-rreferencefile將file56183分﹐公元兩千年。時間可以使用ampm$touch-d"6:03pm" touch$touch-d"6:03pm" touch-d"05/06/2000"$touch-d"6:03pm05/06/2000" $$$$ls$ls使用長列表命令來查看mydir$ls$ls$ls-li2408949-rwxr-xr-x1rootroot709-2112:47當(dāng)用ls$ls-li2408949-rwxr-xr-x1rootroot709-2112:47myfile1inode2408949$cd$ls$cd$lslistat命令來查看mydir$ls-listatrmdirmydirrmdir命令不能刪除一個非空的。為了刪除這個,你需要調(diào)用命令rm–r。$rm-r查看/etc/motd和/etc/passwdcatmore來分別查看每一個命令的輸出方式(提示:/etc/motd文件包括了日期信息及用戶初次登錄后所見到的信息,/etc/passwd文件包括了被使用該系統(tǒng)的用戶的列表)。比較cat和more這兩個命令的說明:把串連接后傳到基本輸出(屏幕或加>fileName到另一個)參數(shù):-n或--number1開始對所有輸出的行數(shù)-b或--number-nonblank和-n-v或--show-nonprinting$cat–ntextfile1>把textfile1和textfile2的內(nèi)容加上行號(空白行不加)之后將內(nèi)容附加到textfile3里$cat–btextfile1textfile2說明:類似cat,不過會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按串的功能(vi相似),使用中的說明文件,請按h。參數(shù):-num一次顯示的行數(shù)-d提示使用者,在畫面下方顯示[Pressspacetocontinueqtoquit.],如果使用者按錯鍵,則會顯示[Press'h'forinstructions.]而不是'嗶'聲-f計算行數(shù)時,以實際上的行數(shù),而非自動換行過后的行數(shù)(有些單行字?jǐn)?shù)太長的會被擴(kuò)-c跟-p+num從第num行開始顯示fileNames欲顯示內(nèi)容的,可為復(fù)數(shù)個數(shù)$more-s$more+20$cat$more$cat$morecatmore兩個命令的異同:catmore兩個命令都用于顯示一個文件的內(nèi)容。cat命令將catmore命令,該命令每次只顯 $cp/usr/bin/cal $ $mkdir $cd $mkdir $cp/etc/profile$cat$more$cat$more查看goodstuff $mv./goodstuff/newprofile$ls $ls- 中。試著用rmdir刪除 使用方式:rmdir[-p]dirName 參數(shù):-p是當(dāng)子 下,名為AAA的 $rmdir 下的BBB 中,刪除名為Test的子 。若Test刪除后,BBB ,則BBB亦予刪除:$rmdir-p $rmdir由于goodstuff $ls$rm$rmdir進(jìn)入到goodstuff 中的所有文件列表。注意.和..這兩個項目仍然在那里。如果一個 $ls$rm$rmdir$cd$ls-在myscript 中,只使用mkdir命令一次,就創(chuàng)建出子 sports和sports $cd$ls-$cp/etc/motd$cat>newfile1I‘mnewfile1.I‘mnewfile2.$ls將文件$cp/etc/motd$cat>newfile1I‘mnewfile1.I‘mnewfile2.$ls $rm-r實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):1 權(quán)限的機(jī)會。作完這些練習(xí)之后,使學(xué)生能夠?qū)INUX中文件 readr):writew read(r):列 write(w): execute(x):中的文 的execute權(quán)限,不僅意味著允許查看 ls可用來獲取 l:b:文件的硬數(shù)dateandtimemtime在本練習(xí)中,學(xué)生將使用LINUX命令來文件與 在進(jìn)行時,首先必須弄清楚自己所在的。如果你對自己目前的位置失去了感pwd命令,來查看你所在的當(dāng)前。 例:$cd登錄進(jìn)入系統(tǒng)。進(jìn)入myscripts 令:$cd$ls 注:運(yùn)行結(jié)果為-rwxr-xr-x1zzusers1870010-2021:40mycal,查看,得到所有 中的cat文件和cal文件使用長列表命令,并把它們與myscripts 令:$ls–l$ls–l-rwxr-xr-x1rootroot-rwxr-xr-x1rootroot187002007-01-12-rwxr-xr-x1rootroot187002007-01-12改變myscripts 中mycal和mycat文件的更改時間。請調(diào)用相關(guān)令來查看改動是否已經(jīng)成功了?touch命令的另外一個功能是什么? 例:$touch–t200012251300// bball 0MonDec2513:00:00 備注:查看是否創(chuàng)建成功,可用ls–lfilename]設(shè)法做到這一點:在你的用戶主中能夠以home_mycalthisisthisis$lnmycalthisisthisis$ln–s/myscripts/mycal$ls–l$rm cat:home_mycal:nocat:home_mycal:nosuchfileor使用長列表命令查看文件的數(shù)分別為:home_mycal(1) home_mycal文件,它運(yùn)行了嗎?為什么?改變文件權(quán)限令是od備注:“所有者”叫做u;“同一用戶組的人”叫做g;其他人叫做o。(就是行權(quán)限;“odu+rmydoc”表示增設(shè)同一用戶組對mydoc文件的權(quán)限。$odu+rhome_mycal。當(dāng)你這樣做的時候,也刪除了myscripts/mycal文件嗎?為什么?刪除文件可以使用rm命令 名稱解答:$rm–f進(jìn)入到myscripts od命令的符號方式,將mycat文件中的其它用戶的讀解答 odo-r$ls–l 解答 od400my$ls–l位數(shù)字都是按照下面的算法得來的:如果賦予讀權(quán)限,算4;如果賦予寫權(quán)寫權(quán)限,那就是2+4=6!解答:$mycat*.profile 改變myscripts 解答:$odu-wxmyscipts odu+r解答:$ls–lmyscipts 解答:$cdmyscipts$ls 解答:$rm–fmycat將myscripts 解答:$od755myscripts$rm–f到用戶的擁有者是zz。實驗四s初實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):2 s簡 s的程序。s是一個命令解釋程序,它控制用戶與內(nèi)核之間的交互作用。由于作s的程序。除了解釋用戶從鍵盤上鍵入令外,s也可以解釋在文件中令。事實上,Linux中的s程序相當(dāng)于MS-DOS中的 程序。在MS-DOS中,命令的文本文件稱為批處理文件,擴(kuò)展名為.bat。但在Linux中,命令的文本文件稱為s 現(xiàn)在的s是一種功能非常強(qiáng)大而且非常靈活的工具,它所提供的許多功能使在系統(tǒng)下工作更簡單且更迅速。s實際上是一種編程語言,與BASIC語言或MS-DOS的批命令相似,但它的功能要比MS-DOS的批處理命令強(qiáng)大很多,書寫形式也更優(yōu)雅。s編程廣泛地用于獲取經(jīng)常執(zhí)行令和過程。一般來說,當(dāng)應(yīng)用程序的易理解性和易修改性較之運(yùn)行時的效率和速度更重要時,系統(tǒng)設(shè)計通常傾向于用s編程語言編寫應(yīng)用程序。量。與環(huán)境變量不同的是,用戶只能s特殊變量,而不能設(shè)置這些變量的值。s特殊變量都由符$后隨單個字符組成。echools–alnotereport則$*的值為字符串“-alnotereportREADME”與$*變量一樣,$@變量也包含了執(zhí)行 ls–alnotereport這是一組變量,其中$1表示執(zhí)行s命令時所鍵入的第一個參數(shù),而$2表示執(zhí)行echoo作就被執(zhí)行一次。因而通過shift命令,也能查看所有參數(shù)。$$變量保存了當(dāng)前正在運(yùn)行的s程序的進(jìn)程標(biāo)識符(pid),這在s 很有用的。下面的例子用來在s中查看該變量的值:$$$$!變量保存了最近一個在運(yùn)行令的進(jìn)程標(biāo)識符(pid),這在s 是很有用的。下面的例子用來在s中查看該變量的值:$echo$echo$-$set$echo$-$ls-$echo-$echo$echo3.3. 標(biāo)準(zhǔn)輸入和輸出在命令行上直接建立s文件。下面給出了使用cat命令建立s的法cat>echoUsername:$LOGNAMEechoHomedirectory:$HOMEechoCurrentsPID: s文件有三種方法件中令,然后終止自己的執(zhí)行并返回到原來的s下。$sh$shprint_userUserCurrentsPID:401$$可以看出,print_userspid401,而在命令行下顯示的當(dāng)前s的pid是356,因此用sh命令執(zhí)行s文件時的s與命令行中的s不一樣。也就是說,sh命令是用s來執(zhí)行s文件的?!?”命令是s的一個命令,該命令將s文件作為當(dāng)前進(jìn)程的一部分來執(zhí)行。也就是說,與用sh命令執(zhí)行s文件時不一樣,“.”命令不是產(chǎn)生一個子s去執(zhí)行s文件。當(dāng)該s文件執(zhí)行結(jié)束時,當(dāng)前進(jìn)程繼續(xù)執(zhí)行原來的程$.s文件$.print_userUsername:jameCurrentsPID:356$$從上面的例子可以看出,執(zhí)行print_user文件時的s與當(dāng)前s的pid都是356,因此這兩個s是同一個s。也就是說,“.”命令在執(zhí)行s文件時沒有產(chǎn)生子s。exec也是一個s命令,該命令在執(zhí)行s文件時會用當(dāng)前進(jìn)程覆蓋當(dāng)命令執(zhí)行完畢,將不會回到當(dāng)前s中,而是回到上一層的s中。如果沒有上一層s,則將回到用戶登錄之前的狀態(tài)。exec命令在執(zhí)行s文件時也不會產(chǎn)生子$exec./s文件在用exec命令執(zhí)行s文件時,該文件必須具有執(zhí)行權(quán)限。先用od命令設(shè)置s文件的可執(zhí)行權(quán)限,如下例所示:$oda+x$$Username:jameCurrentsPID:356RedHatLinuxreleaseKernel2.0.34onani586localhostlogin:進(jìn)程被覆蓋,因此在exec命令執(zhí)行完畢后,沒有任何s正在運(yùn)行,從而顯示出 s是用戶與內(nèi)核之間的接口,s在(理解)解釋了用戶輸入令之后,就調(diào)用內(nèi)核中的程序來執(zhí)行它。所以,了解s LINUX用戶接口的基礎(chǔ)。你將使用 式與選項的信息,使用man命令。在這個練習(xí)中,有些很長令將出現(xiàn)多次。使用命令?可以由表示限定范圍的起始字符、終止字符及中間的連字符(-)組成。例如,a[a-d]與a[abcd]的作用相同。S將把與命令行中指定的模式串相匹配的所有文件名都作為命令的 調(diào)用簡單的ls命令,來列出用戶的主 $ls-$ls*:當(dāng) $$cd$ls$ls$ls該命令的輸出作為more命令的輸入。$$ls[!c-$ls[!c-t]*|$cd其輸入的。例如,pwd(打印工作)命令就不能將一個文件名作為其標(biāo)準(zhǔn)輸入,因為它一個新行的開始處,按<ctrl-d>以返回到s的$提示符。$cat>$cat>>$catjunk|mail$$catjunk|mail$進(jìn)入mail程序后,它會給用戶一個提示符&,用戶可以在這個提示符下鍵入命令來閱讀、發(fā)送、編輯、、刪除郵件。Mail程序令較多,不容易記住,用戶可以首先鍵入help或?,mail程序?qū)@示常用命令幫助信息。例如,鍵入t將在屏幕上閱讀當(dāng)前郵件,鍵入n將跳到下一個郵件,并顯示出來。用戶還可以使用數(shù)字鍵直接選擇要閱讀的郵件。此$$有兩條命令可以完成該退出操作:quit(q)和exit(x)。quit命令首先去年已經(jīng)閱讀過的郵 中名為mbox的文件中(以添加方式進(jìn)行),然后結(jié)束mail程序的運(yùn)行回到S界面。用exit命令直接退出mail程序,將不對系統(tǒng)郵箱做任何整$ $ $ls>$wc-w$cat$rm$wc-w$cat$rm $ls|wc-得到了顯示在屏幕上的文件數(shù)目了嗎?查看junk2文件的內(nèi)容,其中包含了你想要的數(shù)字$ls|wc–w|$ls|wc–w|tee$cat 中的文件。把結(jié)果輸出到文件junk3中。計算這個逆序列表的單詞數(shù),并將結(jié)果輸出到文件junk3的末尾。注意,重定向操作,有追加內(nèi)容到文件末尾的功能。在這個非常特殊的例子中,你可能得到的是你不想要的結(jié)果。因為junk3文件在本命令$ls|sort-r|teejunk3|wc-w>> $date;who;pwd;ls-長列表當(dāng)前中的所有文件,包括隱藏文件$ls-la|teereverse.listing$ls-la|teereverse.listing|wc-w|tee$teefile2|teefile3|teefile4|wc-l>五、findfind是一個非常有效的工具,它可以遍歷當(dāng)前 。find命令的一般形式為:findpathname-options[-print-exec-ok],參數(shù)分別代 command',注意和\ $find在你的用戶主中查找所有以字母sls–l命$find~-name―*s‖-typef-execls-l{}ls–l命令時,采用與用戶進(jìn)行交$find~-name―*s‖-typef-okls-l{}$find/usr/-useruucp-print2>errfile|$find/usr/-useruucp-print2>errfile|$cat 創(chuàng)建一個名為level1的 進(jìn)入到level1 創(chuàng)建一個名為level2 level2中創(chuàng)建一個名為letter2的零長度文件 中,列出所有以字母l開頭的文件與 中,啟動一個查找命令。查找出所有以字母l開頭的文件與 $ls $$$mkdir$>$cd$mkdir$>$cd$ls-R$find~-name"l*"-六、grepLinux系統(tǒng)提供了一個過濾程序,該程序根據(jù)指定的正規(guī)表達(dá)式來查找文件中的字符grep命令。grep(glbaregularexpressionandprint)命令從指定的輸入文找與指定的正則表達(dá)式相匹配的行。默認(rèn)情況下,grep命令將輸出所找到的匹配行。表達(dá)式可以是簡單的字符串。例如,下面的例子是在temp文件中查找并輸出含有字符串output的文本行:$catPrinttheshortversionoftheGNUcopyrightinformationmessageonthestandardoutputandexitsuccessfully$grep"output"informationmessageonthestandardgrep命令中,除非使用了-E選項,否則只能使用基本的正則表達(dá)式而不能使用擴(kuò)展的正則表達(dá)式。任意的基本正則表達(dá)式都可以作為grep命令的匹配模式。$grep'[0-9]'$grep-c'[0-9]'七、sort選項最初是用來對數(shù)據(jù)庫格式的文件內(nèi)容進(jìn)行各種排序操作的。實際上,sort情況下以整行為關(guān)鍵字按ASCII字符順序進(jìn)行排序。sort[options]文件或使用“-”,則表示排序內(nèi)容來自標(biāo)準(zhǔn)輸入。$sort$sort$sort-r$head-10$head-5$tail-10實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):2psjobs命令監(jiān)視進(jìn)程killjobs命令控制進(jìn)程顯示當(dāng)前進(jìn)程的ID 稱為多任務(wù)操作系統(tǒng)。大家常用的DOS操作系統(tǒng)并不具有該能力,在DOS操作系統(tǒng)下,只能一次運(yùn)行一個程序,因此DOS操作系統(tǒng)只能算作單任務(wù)操作系統(tǒng)。LINUX操作系統(tǒng)的一個優(yōu)點就是,它完全是作為一個多用戶的系統(tǒng)設(shè)計的,在一個帶有多個啞‖終端的計算機(jī)系統(tǒng)中,LINUX操作系統(tǒng)提供了分時操作功能,它把運(yùn)行時間分 同時在方面,由于多個用戶使用的是同一臺計算機(jī)上的同一份,因此無需多意時刻只能執(zhí)行一條指令,但是由于處理器的計算速度快得驚人,例如現(xiàn)在的PentiumPro400MHz,也就說如果一個周期執(zhí)行一條指令的話,處理器可以每秒鐘執(zhí)行400個是mailvimail。假設(shè)在用戶編輯過程中需要發(fā)送一個電子郵件,它不需退出vi就可以直接切換到mail進(jìn)程中。用戶在進(jìn)行切換操作時,操作系統(tǒng)將接受該請求,以及快的速度切換到mail進(jìn)程并刷新屏幕,這個時間間隔相程都只自己的消息隊列,而不影響其他進(jìn)程的消息隊列,這樣各個進(jìn)程之間就互不影響。Windows3.1LINUX操作系統(tǒng)則屬次執(zhí)行。程序只有作系統(tǒng)調(diào)入內(nèi)存并執(zhí)行后,才能夠在系統(tǒng)中產(chǎn)生對應(yīng)于該程序的進(jìn)程。而且程序一旦運(yùn)行完畢,該進(jìn)程就會。形象一點地說,程序和進(jìn)程的關(guān)系好比戲該演員表演,這個角色才活靈活現(xiàn)地出現(xiàn)在觀眾的面前。然而只要演員,這個角IPPID(父進(jìn)程號,ParentPID)表示這個進(jìn)程的父進(jìn)程——即啟動此進(jìn)程的進(jìn)程——的TTY表示該進(jìn)程是從哪個虛擬終端被啟動的。由于啟動該進(jìn)程的用戶可能會同時有多;―‖,zombie(―‖,―‖,那么這個COMMAND就是命令行。Windows9X中,同一時刻最多只能有一個被激活的窗口,用戶的輸入都被這個窗口接fg和bg命令可以使進(jìn)程臺和之間切換。CPU時間,并且它也不做任何工作。這個進(jìn)程仍然占用系統(tǒng)內(nèi)存,但是這些內(nèi)存可能被交CPUCPU個消息)才能夠競爭CPU資源,這是等待狀態(tài)(wait,也稱為block阻塞或者睡眠CPU才開始執(zhí)行。等待狀態(tài)、就緒狀態(tài)和執(zhí)行狀態(tài)是一個進(jìn)程所具有的最基本的三種狀態(tài),三種狀態(tài)及其轉(zhuǎn)換規(guī)則見下圖。Linux2.2.16版本進(jìn)程共有六種狀態(tài),包括運(yùn)行狀態(tài)、可中斷等待狀態(tài)、不加入獨(dú)占狀態(tài)。各種狀態(tài)對應(yīng)的數(shù)值及說明見表2.1。在運(yùn)行還是處于就緒狀態(tài)準(zhǔn)備運(yùn)行,要靠當(dāng)前是否占有CPUCPU一個currentCPU的進(jìn)程,系統(tǒng)就依靠這個指針來區(qū)分進(jìn)程PCBPCB本已經(jīng)不使用,在2.4.X版本中沒有這種狀態(tài)。不可中斷等待狀態(tài)的進(jìn)程則繼續(xù)等待。在Linux2.2等待某一個事件(比如一組Web),一旦事件發(fā)生,所有進(jìn)程都會被喚醒。因此,LinuxWeb會試圖響應(yīng)Web會是一個,系統(tǒng)必須調(diào)度使得所有其他的進(jìn)程繼續(xù)休眠。雖然Linux下面來看Linux系統(tǒng)進(jìn)程的狀態(tài)轉(zhuǎn)換情況。為了更為直觀,采取了一定的簡化措狀態(tài)考慮,不再區(qū)分是否可中斷,獨(dú)占狀態(tài)也作為一種等待狀態(tài)處理;不涉及交換狀態(tài)。簡化的進(jìn)程狀態(tài)及轉(zhuǎn)換情況見下圖。CPU,進(jìn)入運(yùn)行狀態(tài)。這樣,進(jìn)程的整個CPU,轉(zhuǎn)入就緒狀態(tài),等待下,進(jìn)程了PCB之外的所有系統(tǒng)資源。也就是說,它在系統(tǒng)中只留下這個進(jìn)程的一個PCB。僵死進(jìn)程的父進(jìn)程通過PCB了解到該進(jìn)程所處的狀態(tài)后,采取相應(yīng)的處理措施,回收PCB,這個進(jìn)程就完成了它的使命,從僵死徹底消亡,上圖右上方的虛箭頭表示了刻——即系統(tǒng)執(zhí)行ps命令的那一剎的進(jìn)程狀態(tài)。 psauSSR到用戶結(jié)束top命令,監(jiān)測才告終止。語法:kill9kill456kill9456456語法:kill%n&語法:setvar語法:unsetvar語法:whowhoami語法:rusersCtrl+D>$$$$$$$$$$ls-R/>outfile22>>errfile[1]$PID$ls-R/>outfile22>>errfile[1]$PID TIME3211 00:00:003242 00:00:003247 00:00:003248 00:00:00$$$$$$echo$x$$$echo$創(chuàng)建一個子s。查看子s 中變量x的值。它的值是多少?列出子s 當(dāng)前變量,有變$$echo$$export$$$export$$echo$x$$$echo$x傳到了父s $echo$x$cat>sc1 $cat>sc15 $$oda+x$/$cat>sc2 exportvar1var2創(chuàng)建另一個名為sc2的s $cat>sc2 exportvar1var2sc2var1var2的值。var1與var2的值分別為多少?為什么? oda+x$$echo$echo$.$echoo$echo$var2$.$echoo$echo$var2lsRoutfile2>$$ls-R/>outfile[1]+ls--color=tty-R/>outfile2>>$$[1]+ls--color=tty-R/>outfile2>>errfile$$ls--color=tty-R/>outfile2>>$$ls-R/>outfile22>>errfile[1]$PID TIME3211 00:00:003242 00:00:003247 00:00:003248 00:00:00$$$創(chuàng)建一個包含如下內(nèi)容的s 文件sc3。sleep60ls–R/>outfile2>errfile$$cat>sc3sleep60ls-R/>outfile2>>errfile$oda+x$nohup./sc3>sc3.out2>>sc3err$$$$cat$cat使用ls–R/命令(將錯誤重定向,將輸出重定向),在啟動這個運(yùn)行時間很長的作業(yè)。請記錄該進(jìn)程的ID號。$$ls-R/>outfile2>>errfile[1]ID的情況下,殺死這個進(jìn)程。確認(rèn)你已經(jīng)殺死了該進(jìn)程。$kill$kill-9$$$$who$whoam實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):1發(fā)送和接收使用wall命令,將信息告知所有用戶進(jìn)程間通過消息系統(tǒng)通信。如果進(jìn)程P和Q要通信,它們必須互相發(fā)送和接收消息。mailboxsports發(fā)送或接收。每個mailbox有唯一的識別號。一個net可以通過網(wǎng)絡(luò)連接網(wǎng)絡(luò)上的計算機(jī)——也包括本地計算機(jī)(只要本地計算機(jī)上安裝了包括loopback在內(nèi)的任何一個網(wǎng)絡(luò)接口)。建立連接以后,可以在本地計算機(jī)上在linux中輸入mail,就進(jìn)行了收件箱,并顯示二十封郵件列表。h|headers d刪除當(dāng)前郵件,指針并下移。d1-100刪除第1100封郵件f|fromnum指針移動到某一封郵件 v|visual top 下的mbox文件中。如果在mbox中刪除文件才會徹底刪除。 cd讀信時,按一次Ctrl+C,退出閱讀狀態(tài)。語法:mail-s“”用戶名@地址<文件mail-s“program”user<file.c將file.c當(dāng)做mail的內(nèi)容,送至user,語法:mail用戶名mail@接受地址mailSubject:mail::::CtrlCCc(Carboncopy):一份正文,給其他的收信人–若屏幕顯示為“Mailqueueisempty”mailwrite[終端名稱一、發(fā)送與接收mail$mail$mail$$g1g2之間互相使用write$$writeIamwaitingfor<ctrl–$$writeIambusy<ctrl–$$mesgmesgn時,看一看其他用戶還能利用write指令將信息直接顯示在您的屏幕$$mesg[root@wljsroot]#rpm[root@wljsroot]#rpmnet-2、net-server[root@wljsroot]#rpm[root@wljsroot]#rpmnet-2、net-server,這個包提供的是net服務(wù)器端程序; 一般只要安裝net-server包。[root@wljsroot]#rpm [root@wljsroot]#rpm 方法一:使用ntsysv,在出現(xiàn)的窗口之中,將net前面*加上,然后按下OK。方法二:編輯/etc/xinetd.d/net[root@wljsroot]#servicexinetd[root@wljsroot]#vi/etc/xinetd.d/net找到disableyes將yes[root@wljsroot]#servicexinetd[root@wljs #vinet23/tcpnetnet23/tcpnet將23修改成未使用的端 (如:2000),退出vi,重啟 net服務(wù),net默認(rèn)端口#vi/etc/xinetd.d/ {disable=no#激活 net服務(wù)#vi/etc/xinetd.d/ {disable=no#激活 net服務(wù),nobind=7#youriponly_from/16~55only_from= }六 net不是很安全,默認(rèn)的情況之下不允許root以net進(jìn)入Linux主機(jī)。若要允許root用戶登入,可用下列方法:[root@wljs/root]#virootLinux主機(jī)了。不過,建議不要這樣做。也可以在普通用戶進(jìn)入后,切換到root用戶,擁有root的權(quán)限。1登陸的基本概登陸是指用戶使用net命令,使自己的計算機(jī)暫時成為主機(jī)的一個仿真終2登陸的產(chǎn)生及發(fā)的TCP連接,當(dāng)然這需要服務(wù)器的應(yīng)答,然后向服務(wù)器發(fā)送鍵入的信息(文件編輯信息),似乎有了客戶機(jī)/服務(wù)器模型的服務(wù),一切問題都可以解決了。然而實際并非你想假如的要求并不是這么簡單,還想實現(xiàn)用戶管理,數(shù)據(jù)錄入,系統(tǒng),想實現(xiàn)一切可以在主機(jī)上實現(xiàn)的操作,那么需要大量的服務(wù)器程序那么有沒有辦法解決呢?當(dāng)然有,可以用登錄來解決這一切。允許用戶作一樣。這樣,便可以遠(yuǎn)地系統(tǒng)上所有可用令,并且系統(tǒng)設(shè)計員不需提供多個地服務(wù)器程序。問題發(fā)展到這里好像前途一片光明了,用登錄總應(yīng)該解決問題了吧,但要實現(xiàn)登陸并不簡單。不考慮網(wǎng)絡(luò)設(shè)計的計算機(jī)系統(tǒng)期望用戶只從直接相連的鍵盤和顯示器上登錄,在這種機(jī)器上增加登陸功能需要修改機(jī)器的操作系統(tǒng),這是極其艱巨也是盡量避免的。因此應(yīng)該集中力量構(gòu)造登陸服務(wù)器,雖然但盡管有技術(shù)上的,系統(tǒng)編程還是設(shè)法構(gòu)造了能夠應(yīng)用于大多數(shù)操作系統(tǒng)的登陸服務(wù)器,并構(gòu)造了充當(dāng)客戶機(jī)的應(yīng)用。通常,客戶機(jī)取消了除一個與遠(yuǎn)地機(jī)器的交互,就如同坐在主機(jī)面前一樣,從而避免了上述所提到的。終端(pseudoterminal)的支持。用偽終端描述操作系統(tǒng)的點,它允許像 net服務(wù)器),否則,3登錄的工作過程主機(jī)的Ip地址或;將本地終端上輸入的用戶名和口令及以后輸入的任何命令或字符以NVT(NetVirtualTerminal)格式傳送到主機(jī)。該過程實際上是從本機(jī)向主機(jī)發(fā)送一個IP數(shù)據(jù)報;將主機(jī)輸出的NVT格式的數(shù)據(jù)轉(zhuǎn)化為本地所接受的格式送回本地終端,包括實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):3使用戶熟悉C編程工具gcc、gdb、make熟悉gdb常見調(diào)試命令,用gdb調(diào)試一個示例程序,熟悉調(diào)試環(huán)境。目前最常用的GNUC編譯器(gcc)是一個全功能的ANSIC兼容編譯器。如果熟悉其他操作 1: 1: intmain(void){{printf oworld,Linuxreturn}#gcco.c-oo#./ooworld,Linux預(yù)處理(Pre-Processing)#gcc-Eo.c-o編譯(Compiling)#gcc-co.i-o(Linking)#gcco.o-o#include<stdio.h>voidmain(void){longlongintvar=printf("ItisnotstandardC}下面來看看GCC是如何幫助程序員來發(fā)現(xiàn)這些錯誤的。當(dāng)GCC在編譯不符合#gcc-pedanticillcode.c-oillcodeillcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport`longlong'illcode.c:8:returntypeof`main'isnot`int'二、main()charcharmy_string[]= omy_print(my_string);}voidmy_print(char{printf("Thestringis%s\n",}voidmy_print2(char{char*string2;intsize,i;size=strlenstring2=(char*)malloc(size+1);for(i=0;i<size;i++)string2[size-i]=string[i];string2[size+1]=’/0’;printf("Thestringprintedbackwardis%s\n",}用gcc編譯它:gccgotestThestringisoThestringprintedbackward是:Thestringprintedbackwardiserehtolleh,,my_print2函數(shù)沒有正常工作。現(xiàn)在,讓用gdb看看問題究竟出在哪兒,先輸入如下命令:gdbgreeting。如果(gdb)Startingprogram:/root/greetingThestringisothereThestringprintedbackwardisProgramexitedwithcode041這個輸出和在gdb外面運(yùn)行的結(jié)果一樣。,為什么反序打印沒有工作呢?為了找(gdb)list(gdb)list(gdb)1#include23main45charmy_string[]="othere";7my_print8my_print2911my_print(char1213printf("Thestringis%s\n",14116my_print2(char1718char19intsize,size=strlenstring2=(char*)malloc(size+for(i=0;i<size;string2[size-i]=string2[size+1]=printf("Thestringprintedbackwardis%s\n",}(gdb)break24Breakpoint1at0x139:filegreeting.c,line24(gdb)Startingprogram:root/greetingThestringisothereBreakpoint1,my_print2(string=0xbfffdc4"othere")atgreeting.c:2424string2[size-可以通過設(shè)置一個觀察string2[sizei]變量值的觀察點來找出錯誤的產(chǎn)生原因,做(gdb)watchstring2[sizei]Watchpoint2:string2[size-(gdb)經(jīng)過第一次循環(huán)后,gdb告訴string2[size-i]的值是h。gdb顯示如下信息:Watchpoint2,string2[size-i]Oldvalue=0`\0’00Newvalue=104’`hmy_print2(string=0xbfffdc4"othere")atgreeting.c:2323for(i=0;i<size;i++)這個值正是期望的。后來的數(shù)次循環(huán)的結(jié)果也都是正確的。當(dāng)i=10時,表達(dá)式string2[sizei]的值等于`e`,sizei1,最后一個字符已經(jīng)拷貝到新的字第一個字符是空字符。這解釋了為什么在打印string2時沒有任何輸出。找出了問題的所在,修正這個錯誤也就會變得很容易。可以把代碼里寫入string2的001011main()charcharmy_string[]= omy_print(my_string);}my_print(char{printf("Thestringis%s\n",}my_print2(char{char*string2;intsize,size2,i;size=strlen(string);size2=size-1;string2=(char*)malloc(size+1);for(i=0;i<size;i++)string2[size2-i]=string[i];string2[size]=`’\0;printf("Thestringprintedbackwardis%s\n",}三、make命令通過makefile文件來描述源程序之間的相互關(guān)系并自動編譯工作。而makefile文件需要按照某種語法進(jìn)行編寫,文件中需要說明如何編譯各個源文件并連接生式為:make[flags][macrodefinitions][s] 使用build-in規(guī)則 -c 在makefile之前改變到指定 -I 在處理makefile之前和之后,都顯示工 通過命令行參數(shù)中的,可指定make要編譯的目標(biāo),并且允許同時定義編譯多個目標(biāo),操作時按照從左向右的順序依次編譯選項中指定的目標(biāo)文件。如果命令行中沒有指定目標(biāo),則系統(tǒng)默認(rèn)指向描述文件中第一個目標(biāo)文件。實驗八Linux實驗類型:課程設(shè)計實驗時數(shù)(學(xué)分):12斷的實現(xiàn)原理,學(xué)習(xí)LINUX的內(nèi)核機(jī)制以及內(nèi)核時鐘機(jī)制。#include<stdio.h>#include<time.h>#include#include<stdio.h>#include<time.h>#include<sys/time.h>voidfunction(){unsignedinti,j;doubley;}int{structtimevaltpstart,tpend;floattimeuse;return}中的asmlinkagelongsys_gettimeofday(structtimeval*tv,structtimezone{if(tv)structtimevalktv;if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;}if(tz)if(copy_to_user(tz,&sys_tz,sizeof(sys_tz)))return-EFAULT;}return}解答:這個syscall用來供用戶獲取timeval格式的asmlinkagelongsys_gettimeofday(structtimeval*tv,structtimezone{if(tv)structtimevalktv;if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;}if(tz)if(copy_to_user(tz,&sys_tz,sizeof(sys_tz)))return-EFAULT;}return}如果tv指針有效,則說明用戶要以timeval格式來檢索系統(tǒng)當(dāng)前時間。為此,先調(diào)用do_gettimeofday()函數(shù)來檢索系統(tǒng)當(dāng)前時間并保存到局部變量ktv中。然后再調(diào)用將全局變量sys_tz中的時區(qū)信息拷貝到參數(shù)指針tz所指向的用戶空間緩沖區(qū)中。Thisversionofgettimeofdayhasmicrosecondandbetterthanmicrosecondprecisiononfastx86machineswithvoiddo_gettimeofday(structtimeval{unsignedlongflags;unsignedlongusec,sec;usec=do_gettimeoffset();{unsignedlonglost=jiffies-wall_jiffies;if(lost)usec+=lost*(1000000/}sec=xtime.tv_sec;usec+=xtime.tv_usec;while(usec>={usec-=}tv->tv_sec=sec;tv->tv_usec=usec;}gettimeofday()系統(tǒng)調(diào)用要求時間精度要達(dá)到微秒級,因此do_gettimeofday()函數(shù)不能簡單地返回xtime中的值即可,而必須精確地確定自從時鐘驅(qū)動的BottomHalf上一次更新xtime的那個時刻(由wall_jiffies變量表示)do_gettimeofday()函數(shù)的當(dāng)前執(zhí)行時刻之間的具體時間間隔長度,以便精確地修正xtime的值。如下圖1-1所示:假定被do_gettimeofday()用來修正xtime的時間間隔為fixed_usec,而從wall_jiffies到j(luò)iffies之間的時間間隔是lost_usec,而從jiffies到do_gettimeofday()函數(shù)的執(zhí)行時刻的時間間隔是offset_usec。則下列三個等式成立:刻的CPUTSC寄存器的值,因此可以用X86CPU的TSC寄存器來計算offset_usec的值。函數(shù)真正執(zhí)行時刻之間的時間延遲間隔。每一次timer_interrupt()被執(zhí)行時都會計算這一間隔,并利用TSC的當(dāng)前值更新last_tsc_low變量。假定current_tsc_low是TSC1time_init()函數(shù)所計算的。do_gettimeoffset然后,令sec=xtime.tv_sec,usec=xtime.tv_usec+lost_usec+offset_usec。顯然,secusec用一個while{}循環(huán)來判斷usec是否已經(jīng)溢出而超過106us=1最后,用sec和usec分別更新參數(shù)指針?biāo)赶虻膖imeval結(jié)構(gòu)變量。至此,整個查詢函數(shù)do_gettimeoffset()根據(jù)CPUTSC#ifndef staticstaticunsignedlong{}staticunsignedlong(*do_gettimeoffset)(void)=do_slow_gettimeoffset;#definedo_gettimeoffset()顯然,在配置有TSC寄存器的i386平臺上,do_gettimeoffset(staticstaticinlineunsignedlong{registerunsignedlongeax,/*ReadtheTimeStampCounter*//*..relativetopreviousjiffy(32bitsisenough)*/eax-=last_tsc_low;/*tsc_lowdelta*/*Timeoffset=(tsc_lowdelta)**=(tsc_lowdelta)**=(tsc_lowdelta)*(usecs_per_jiffy/*Usingamullinsteadofadivlsavesupto31clockinthecriticalasm("mull:"=a"(eax),"=d":"rm"(fast_gettimeoffset_quotient),"0"(eax));/*ouradjustedtimeoffsetinmicroseconds*/returndelay_at_last_interrupt+edx;}變量中,低32位保存在局部變量eax中。顯然,從上一次timer_interrupt返回值delay_at_last_interrupt+(Δtsc_low*fast_gettimeoffset_quotient)就是從上一次時解答:與itimer定時器相關(guān)的syscall有兩個:getitimer()和setitimer()。其中,getitimer(setitimer()則用來設(shè)置調(diào)用進(jìn)程的三個間隔定時器。這兩個syscall都是現(xiàn)在kernel/itimer.c文件中。/*SMP:Onlywemodifyouritimervalues.asmlinkagelongsys_getitimer(intwhich,structitimerval/*SMP:Onlywemodifyouritimervalues.asmlinkagelongsys_getitimer(intwhich,structitimerval{interror=-structitimervalget_buffer;if(value){error=do_getitimer(which,&get_buffer);if(!error&©_to_user(value,&get_buffer,sizeof(get_buffer)))error=-EFAULT;}return}顯然,sys_getitimer()函數(shù)主要通過do_getitimer()函數(shù)來查詢當(dāng)前進(jìn)程的間隔定時器信息,并將查詢結(jié)果保存在內(nèi)核空間的結(jié)構(gòu)變量get_buffer中。然后,調(diào)用copy_to_usr()宏將get_buffer中結(jié)果拷貝到用戶空間緩沖區(qū)中。intintdo_getitimer(intwhich,structitimerval{registerunsignedlongval,switch{caseinterval=current->it_real_incr;val=0;*FIXME!Thisneedstobeatomic,incasethekerneltimerval=current->real_timer.expires-/*/*lookoutfornegative/zeroitimer..*/if((long)val<=0)val=}caseval=current->it_virt_value;interval=current->it_virt_incr;caseval=current->it_prof_value;interval=current->it_prof_incr;}jiffiestotv(val,&value->it_value);jiffiestotv(interval,&value->it_interval);return0;}which=ITIMER_REALITIMER_REALreal_timer這個內(nèi)核動態(tài)定時器來實現(xiàn)的,因此不能通過current->it_real_value此將val變量簡單地置0就可以了。如果已經(jīng)啟動,則間隔計數(shù)器的當(dāng)前值應(yīng)該等于如果which=ITIMER_VIRT,則查詢當(dāng)前進(jìn)程的ITIMER_VIRT間隔定時器。于是簡單地將計數(shù)器初值it_virt_incr和當(dāng)前值it_virt_value分別保存到局部變量intervalval中。如果which=ITIMER_PROF,則查詢當(dāng)前進(jìn)程的ITIMER_PROF間隔定時器。于是簡單地將計數(shù)器初值it_prof_incr和當(dāng)前值it_prof_value分別保存到局部變量intervalval中。最后,通過轉(zhuǎn)換函數(shù)jiffiestotv()將val和interval轉(zhuǎn)換成timeval格式的時間值,并保存到value->it_value和value->it_interval中,作為查詢結(jié)果返回。函數(shù)sys_setitimer()不僅設(shè)置調(diào)用進(jìn)程的指定間隔定時器,而且還返回該間隔定時器的原有信息。它有三個參數(shù):(1)whichsys_getitimer()中的參數(shù)相同。(2)輸/*SMP:Again,/*SMP:Again,laywithouritimers,andsignalsareSMP*nowsothatisnotanissueatallasmlinkagelongsys_setitimer(intwhich,structitimerval*value,structitimerval*ovalue){structitimervalset_buffer,intif(value)if(copy_from_user(&set_buffer,value,sizeof(set_buffer)))return-EFAULT;}memset((char*)&set_buffer,0,error=do_setitimer(which,&set_buffer,ovalue?&get_buffer:0);if(error||!ovalue)returnif(copy_to_user(ovalue,&get_buffer,return-EFAULT;return0;}在輸入?yún)?shù)指針value非空的情況下,調(diào)用copy_from_user()宏將用戶空間中的待設(shè)置信息拷貝到內(nèi)核空間中的set_buffer結(jié)構(gòu)變量中。如果value指針為空,則簡單地將set_buffer結(jié)構(gòu)變量全部置0。則以內(nèi)核變量get_bufferdo_setitimer()函數(shù)的第三那個調(diào)用參數(shù),這樣當(dāng)do_setitimer()函數(shù)返回時,get_buffer的原來信息。Do_setitimer()函數(shù)返回0值表示成功,非0值表示失敗。在do_setitimer()函數(shù)返回非0值的情況下,或者ovalue指針為空的情況下(不需如果ovalue指針非空,調(diào)用copy_to_user()宏將get_buffer()結(jié)構(gòu)變量中值拷貝到ovalueintintdo_setitimer(intwhich,structitimerval*value,structitimerval{registerunsignedlongi,j;intk;i=tvtojiffies(&value-j=tvtojiffies(&value-ifif(ovalue&&(k=do_getitimer(which,ovalue))<0)returnk;switch{casecurrent->it_real_value=j;current->it_real_incr=i;if(!j)if(j>(unsignedlong)LONG_MAX)j=LONG_MAX;i=j+current->real_timer.expires=i;caseifcurrent->it_virt_value=j;current->it_virt_incr=i;if(j)current->it_prof_value=j;current->it_prof_incr=i;return-}return為單位的時間值。并分別保存在局部變量i和j中。do_getitimer()函數(shù)返回負(fù)值,說明出錯。因此就要直接返回錯誤值。否則繼續(xù)which=ITITMER_REALITIMER_REAL間隔定時器。(a)調(diào)用del_timer_sync()函數(shù)(該函數(shù)在單CPU系統(tǒng)中就是del_timer()函數(shù))將當(dāng)前進(jìn)程的real_timerbit_real_incrit_real_valueij。(c)j=0real_timerbreakswitch?casedreal_timerexpirestimer_bh()過程,給出分析流圖,解釋時鐘中斷處理的全過程。timer_interrupt()needstokeepupthereal-timeaswellascallthe"do_timer()"routineevery{IfwehaveanexternallysynchronizedLinuxclock,thenCMOSclockaccordinglyevery~11minutes.Set_rtc_mmss()hascalledasif((time_status&STA_UNSYNC)==0&&xtime.tv_sec>last_rtc_update+660&&xtime.tv_usec>=500000-((unsigned)tick)/2&&xtime.tv_usec<=500000+((unsignedif(set_rtc_mmss(xtime.tv_sec)==0)c_update=xtime.tv_sec;last_rtc_update=xtime.tv_sec-600; tagainin60s}}判斷是否需要更新CMOS時鐘(即RTC)中的時間。Linux僅在下列三個條件同時成立時才更新CMOS時鐘:①系統(tǒng)全局時間狀態(tài)變量time_status中沒有設(shè)置STA_UNSYNC標(biāo)志,也即說明Linux有一個外部同步時鐘。實際上全局時間狀態(tài)變量time_statusSTA_SYNCadjtimex()系統(tǒng)調(diào)用時(syscallNTP)CMOS時鐘更新已經(jīng)過去了11局變量last_rtc_update保存著上次更新CMOS時鐘的時間。③由于RTC存在Update因此最好在一秒時間間隔的中間位置500ms左右調(diào)用set_rtc_mmss()函數(shù)來更新微秒范圍范圍之內(nèi)時,才調(diào)用set_rtc_mmss()函數(shù)。如果上述條件均成立,那就調(diào)用set_rtc_mmss()將當(dāng)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 冷漆標(biāo)線合同范本
- 出售新舊彩鋼瓦合同范例
- 2024年蕪湖無為市投資促進(jìn)發(fā)展有限公司招聘考試真題
- led電源合同范本
- 公司購銷合同范本
- 2024年清遠(yuǎn)英德市市區(qū)學(xué)校選調(diào)教師(編制)考試真題
- 個人買賣定金合同范本
- 五人合伙工程合同范本
- 交通類ppp合同范本
- 代簽銷售合同范本
- 如何發(fā)揮好辦公室協(xié)調(diào)、督導(dǎo)、服務(wù)職能
- 部隊安全教育教案大全
- 交易商協(xié)會非金融企業(yè)債務(wù)融資工具發(fā)行注冊工作介紹
- 《人與環(huán)境》課程教學(xué)大綱
- 班組長管理能力提升培訓(xùn)(PPT96張)課件
- 深圳市城市用地分類表
- 法蘭蝶閥螺栓配用表
- 垃圾中轉(zhuǎn)站施工方案及施工方法
- 內(nèi)蒙古自治區(qū)小額貸款公司試點管理實施細(xì)則
- 勞務(wù)分包入住生活區(qū)承諾書
- 直系親屬關(guān)系證明(存根)(共1頁)
評論
0/150
提交評論