linux實訓

 

目  錄node

Unit 1 操做系統安裝.... 3linux

1.1 多操做系統安裝... 3程序員

1.1.1 VMware簡介... 3shell

1.1.2 VMWare基本使用... 4編程

1.2 安裝Red Hat Linux 9.0. 15數組

1.3 思考題... 15bash

【實習報告】... 16網絡

Unit 2  Linux命令接口使用.... 17併發

2.1 訪問Linux系統... 17app

2.1.1 建立用戶組... 17

2.1.2 刪除用戶組... 17

2.1.3 建立用戶... 18

2.1.4 刪除用戶... 19

2.2 Linux文件信息命令和基本文件管理... 20

2.3 Linux文件權限... 20

2.3.1 文件權限... 20

2.3.2 設置文件權限... 21

2.3.3 設置文件的擁有權... 22

2.4 思考題... 23

【實習報告】... 25

Unit 3  Linux vi的使用.... 52

3.1 vi的啓動與退出... 52

3.2 光標移動... 53

3.3 編輯操做... 54

3.4 查詢操做... 56

【實習報告】... 57

Unit 4  Linux shell編程.... 59

4.1 shell編程簡介... 59

4.1.1 shell程序文件... 59

4.1.2 shell程序的創建... 60

4.1.3 shell程序的運行... 61

4.1.4 shell變量... 63

4.1.5 shell程序的控制流... 65

4.2 shell程序調試簡介... 68

4.3 實例... 69

【實習報告】... 80

Unit5  Linux C編程.... 82

5.1 程序的編輯與編譯... 82

5.2 程序的調試... 83

5.2.1 gdb簡介... 83

5.2.2 調試實例... 84

5.3 程序與OS間的參數傳遞... 87

【實習報告】... 89

Unit6  Linux設備編程.... 90

6.1 Linux聲音設備編程... 90

6.2 Linux揚聲器編程的應用... 90

6.3 軟盤使用... 92

6.4 U盤使用... 92

【實習報告】... 93

Unit7  Linux併發程序設計.... 94

7.1 Linux進程控制... 94

7.1.1 進程的建立... 95

7.1.2 進程的運行... 96

7.1.3 進程的終止... 98

7.1.4 進程的同步... 99

7.1.5 進程掛起... 100

7.2 Linux進程通訊... 101

7.3 Linux重定向和管道... 105

7.4 管理Linux系統進程... 105

7.5 思考題... 106

【實習報告】... 107

可選練習... 114


Unit 1 操做系統安裝

【實習要求】

一、掌握多操做系統的安裝方法

二、掌握Linux的安裝方法

 

【實習內容】

一、安裝Red Hat Linux 9.0

 

 

1.1 多操做系統安裝

1.1.1 VMware簡介

VMWare Workstation是一個「虛擬PC」軟件。它使你能夠在一臺機器上同時運行兩個或多個操做系統,如Windows、DOS、Linux等。與「多啓動」系統相比,VMWare採用了徹底不一樣的概念。多啓動系統在一個時刻只能運行一個系統,在系統切換時須要從新啓動機器。VMWare是真正「同時」運行多個操做系統在主系統的平臺上,它就象標準Windows應用程序那樣切換。並且每一個操做系統你均可以進行虛擬的分區、配置而不影響真實硬盤的數據,你甚至能夠經過網卡將幾臺虛擬機用網卡鏈接爲一個局域網,極其方便。它爲操做系統,或網絡實習提供了極好的運行平臺環境。

 

1、虛擬機(VM

VM――Virtual Machine,虛擬機是指運行於宿主機系統中的虛擬系統,該系統模擬了物理計算機的硬件控制模式,具有有運行於物理計算機硬件上系統的大部分功能,以及物理計算機不具有的部分擴展功能。

 

2、宿主機與客戶機

宿主機即物理計算機。

客戶機即運行於虛擬機軟件中的系統。

 

3、經常使用虛擬機軟件

經常使用支持宿主機系統爲:Windows 98/Windows 2k/Windows XP/VISTA/Linux的虛擬機軟件有:

(1)VMware Workstation(英文版)

註冊:共享版,有使用期限,須要官方受權,網上有註冊機。

(2)Virtual PC(英文版)

註冊:共享版,有使用期限。

(3)Parallels Workstation(英文版)

註冊:試用版,有使用期限,須要官方受權,網上有註冊機。

(4)VirtualBox(多國語言——中文版)

註冊:免費版本,無需註冊。

(5)QEMU(中文版)

註冊:免費版本,無需註冊。

 

1.1.2 VMWare基本使用

下面以VMware Workstation 6.0.1 for Windows(英文版)爲例,簡要說明利用虛擬機軟件建立虛擬系統,並進行虛擬機系統安裝的基本過程。

 

1、菜單欄介紹

(1)File

主要管理虛擬機在宿主機中的文件,具體命令項以下:

 

l  New:新建虛擬機/組/窗口。

l  Open:打開存在的虛擬機文件。

l  Import:導入其餘支持的類型文件,轉換爲VMware的虛擬機文件格式,例如Virtual PC的虛擬機文件。

l  Close:關閉當前打開的虛擬機。

l  Map or Disconnect Virtual Disks…:將支持類型的虛擬機文件映射爲一個硬盤,或取消映射。

l  Remove from Favorites:從左側收藏夾中刪除,不會影響磁盤中文件。

l  Exit:退出。

 

(2)Edit

編輯虛擬機全局設置和控制菜單,具體命令項以下:

 

l  Cut:剪切。

l  Copy:複製。

l  Paste:粘貼。

l  Virtual Network Settings…:設置虛擬機與宿主機網絡鏈接方式。

l  Preferences…:設置虛擬機選項參數。

 

(3)View

查看虛擬機和客戶機選項,具體命令項以下:

 

l  Full Screen:全屏,使當前虛擬機屏幕覆蓋宿主機屏幕。

l  Quick Switch:快速切換,當打開多個客戶機時,進行快速切換。

l  Current View:當前查看。

l  Autofit Window:自動匹配窗口,使客戶機窗口自動匹配虛擬機窗口,需安裝VMware tools。

l  Autofit Guest:自動匹配客戶機,使虛擬機自動匹配窗口客戶機窗口,需安裝VMware tools。

l  Fit Window Now:當即匹配窗口,當即使客戶機窗口匹配虛擬機窗口,需安裝VMware tools。

l  Fit Guest Now:當即匹配客戶機,當即使虛擬機匹配窗口客戶機窗口,需安裝VMware tools。

l  Go to Home Tab:轉到主頁。

l  Sidebar:邊欄。

l  Toolbars:工具欄。

l  Status Bar:狀態欄。

l  Tabs:標籤。

 

(4)VM

虛擬機,具體命令項以下。

 

l  Power:電源,當前客戶機電源開關。

l  Removable Devices:可移動設備,管理鏈接到客戶機的可移動設備,如U盤等。

l  Snapshot:快照,建立、管理或恢復快照,建立快照即記錄當前客戶機的狀態,恢復快照即恢復到建立快照時的狀態。

l  Replay:重放,重放虛擬機記錄的操做,需開啓客戶機設置中容許重放設置。

l  Clone:克隆,建立客戶機當前狀態的克隆,比徹底複製節省時間和磁盤空間,而且可避免網絡衝突。

l  Install VMware Tools…:安裝VMware工具…,VMware Tools提供了顯示和性能的優化和控制的方便。

l  Upgrade or Change version:升級,升級虛擬機軟件。

l  Connected Users:已鏈接用戶,虛擬機客戶機當前遠程控制的用戶。

l  Send Ctrl+Alt+Del:發送Ctrl+Alt+Del,在客戶機中發送Ctrl+Alt+Del。

l  Grab Input:抓獲輸入,保持鼠標和鍵盤等輸入設備在客戶機中有效。

l  Capture Screen…:捕獲屏幕…,捕獲當前客戶機屏幕顯示,即截屏。

l  Capture Movie…:捕獲影片…,動態捕捉當前客戶機屏幕顯示,將在宿主機中保存爲影片。

l  Delete from Disk:從磁盤刪除,從宿主機磁盤中刪除虛擬機文件,不可恢復。

l  Message Log:消息日誌,事件日誌,可協助解決虛擬機設置不正確問題。

l  Settings…:設置…,當前客戶機相關選項。

 

(5)Team

將多個客戶機合併爲一組以方便網絡通訊是組的做用,具體命令項以下:

 

l  Power:組電源,控制當前組全部客戶機的總電源。

l  Switch to:轉到組中指定客戶機。

l  Add:增長新的客戶機成員到本組。

l  Remove:移除本組中指定客戶機,該客戶機文件不會在宿主機磁盤中刪除。

l  Delete from Disk:從磁盤中刪除組配置文件,解散組,不會刪除該組中客戶機的文件。

l  Settings…:組選項設置。

l  Windows:客戶機窗口切換。

l  Home:主頁。

l  Next Window:下一窗口。

l  Previous Window:前一窗口。

 

(5)Help

幫助。

 

2VMware Workstation使用實例

實例中宿主機與客戶機系統說明以下:

 

宿主機系統爲:

l  Windows XP with SP2 簡體中文專業版

 

客戶機系統分別爲:

l  Red Hat Linux 9.0(紅帽子Linux 9.0 簡體中文版)

l  Windows Server 2003 R2 with SP2 簡體中文企業版

l  Windows XP with SP2 簡體中文專業版

 

步驟以下:

(1)建立新的客戶機,點擊菜單命令「File/New/Virtual Machine」,如圖1-1。

 

 

圖1-1

 

(2)出現如圖1-2所示的「New Virtual Machine Wizard」對話框,點擊「下一步」。

 

 

圖1-2

 

(3)出現如圖1-3所示對話話,選中「Typical」項,再點擊「下一步」。

注:如選擇「Custom」項,則能夠選擇製做與VMware Workstation 6.0以前版本以及VMware ACE等軟件兼容的虛擬機,供其使用,或僅製做能供VMware Workstation 6.0以後版本軟件使用的虛擬機。以及內存等其餘選項的自定義。

 

(4)出現如圖1-4所示的對話框窗口,選擇客戶機將使用的操做系統。咱們將安裝Windows XP,選擇Microsoft Windows,同時在Version下拉菜單中選擇Windows XP Professional 。點擊「下一步」。

 

 

圖1-3

 

 

圖1-4

 

(5)出現如圖1-5所示的對話框窗口,定義客戶機的名稱,以及對應客戶機文件在宿主機磁盤中的存放位置。保持默認,點擊「下一步」。

 

 

圖1-5

 

(6)出現如圖1-6所示的對話框窗口,選擇網絡訪問模式。這個須要注意一下,選擇「Use bridged networking」或「Use network address translation(NAT)」,點擊「下一步」。

 

注:

Use bridged networking:使用橋接

Use network address translation(NAT):使用網絡地址轉換

Use host-only networking:僅和主機相連

Do not use a network connection:不使用網絡鏈接

 

(7)出現如圖1-7所示的對話框窗口,定義虛擬機最大硬盤容量。保持默認,點擊「完成」。

 

 

圖1-6

 

 

圖1-7

 

(8)至此,虛擬機客戶機建立完成,如圖1-8所示。接下來,將在這個客戶機中安裝操做系統。

 

 

圖1-8

 

(9)在進行客戶機系統安裝前,要作一些準備。如圖1-9所示,對虛擬機設備進行設置,具體有:

Memory

Hard Disk

CD-ROM

Floppy

USB Controller

Sound Adapter

Display

Processors

 

而後,在客戶機的光驅中放入安裝系統的光盤,在此使用的是深度論壇的Windows XP Ghost 安裝光盤5.0版做爲安裝Windows XP實例。

 

圖1-9

 

(10)在安裝操做系統前,須對客戶機硬盤進行分區,而後才能進行安裝,須要提醒注意的是系統盤分區必須設置爲活動,如圖1-10中狀態必須爲「做用」,不然系統沒法正確引導。

 

圖1-10

 

(11)圖1-11爲Ghost快速恢復過程,即恢復Windows XP。建議學生利用虛擬機練習Windows XP安裝。

 

 

圖1-11

 

(12)系統安裝完成後,進入系統如圖1-12。注意最底下狀態欄中出現警示「VMware tools is not installed in this guest.……」,即系統提示未安裝VMware tools。在這種狀態下,沒法快速調整客戶機屏幕大小,鼠標鍵盤進入客戶機後,沒法移出到宿主機,而必須按熱鍵「Ctrl+Alt」才能釋放鼠標和鍵盤輸入。

 

(13)點擊菜單命令「VM/Install VMware tools...」,如圖1-13所示,安裝VMware tools。安裝完成要求從新啓動客戶機。

 

(14)從新啓動客戶機後,如圖1-14所示,狀態欄再也不出現警示。此時,客戶機窗口大小能夠隨意調整了,鼠標也能夠在客戶機和宿主機之間自由移動。如今使用客戶機就像咱們在Windows中使用通常應用程序那樣方便了。

 

至此客戶機系統部署完成,咱們能像使用宿主機同樣使用客戶機了。

 

 

 

 

圖1-12

 

 

圖1-13

 

 

 

圖1-14

 

1.2 安裝Red Hat Linux 9.0

 

 

 


【實習報告】

實習報告:操做系統安裝

 

 

1、實習內容

 

 

一、安裝Red Hat Linux 9.0

 

 

 

 

2、實習總結

 

 

 


Unit 2  Linux命令接口使用

【實習要求】

一、掌握Linux系統訪問的經常使用命令

二、掌握Linux文件的基本操做

三、瞭解Linux系統結構

 

【實習內容】

一、訪問Linux系統

二、Linux文件信息命令和基本文件管理

三、Linux文件權限

 

【實習指導】

2.1 訪問Linux系統

 

2.1.1 建立用戶組

建立用戶組可以使用命令groupadd來實現,下面介紹groupadd命令的基本使用。

格式:

groupadd  <組名>

功能:建立由<組名>指定的用戶組。

例如,要求新建一名爲「group1」的用戶組,方法以下:

(1)以超級用戶身份登陸系統。

(2)建立用戶組「group1」,鍵入命令「groupadd  group1」。

(3)檢查用戶組「group1」是否已成功建立,鍵入命令「cat /etc/group | more」,可觀察到名爲「group1」的用戶組已建立。

2.1.2 刪除用戶組

當一用戶組再也不須要時,應將其刪除。但要注意:若是要刪除的組是當前登陸的某個用戶的基本組,則不可刪除。另外,若要刪除某一組,則應將系統中屬於該用戶組的文件和目錄改成其餘的組,而後再刪除它。刪除用戶組可以使用命令groupdel來實現,下面介紹groupdel命令的基本使用。

格式:

groupdel  <組名>

功能:

刪除由<組名>指定的用戶組。

例如,要求將名爲「group1」的用戶組刪除,方法以下:

(1)以超級用戶身份登陸系統。

(2)刪除用戶組「group1」,鍵入命令「groupdel  group1」。

(3)檢查用戶組「group1」是否已成功刪除,鍵入命令「cat  /etc/group | more」,可觀察到名爲「group1」的用戶組已不存在。

2.1.3 建立用戶

Linux系統中,除超級用戶root是在安裝時由系統建立外,其他用戶均由超級用戶建立。所謂建立用戶,即爲一新用戶建立登陸系統的帳號,包括建立用戶名和設置該用戶的口令。建立用戶名可以使用命令「useradd」來實現,設置用戶口令可以使用命令「passwd」來實現。下面分別介紹命令「useradd」和「passwd」的基本使用。

 

1useradd命令

格式:

useradd  [-g  <組名>] [-d  <用戶工做目錄>] <用戶名>

功能:建立由<用戶名>指定的新用戶,且產生一個該用戶所獨立擁有的用戶工做目錄。

選項說明:

-g  <組名>:<組名>指定了新用戶所屬的組(注意,該組必須已經存在)。當選項-g缺省時,則新建用戶所屬組名與用戶名相同。

-d  <用戶工做目錄>:<用戶工做目錄>指定了新用戶所獨立擁有的工做目錄的位置(注意:該目錄必須已存在)。當選項-d缺省時,則新建用戶所獨立擁有的工做目錄位於/home下。

 

2passwd命令

格式:

passwd  [用戶名]

功能:對由「用戶名」指定的用戶建立或修改口令。注意:當「用戶名」缺省時,是對當前用戶修改口令。超級用戶能建立和修改全部用戶的口令,而普通用戶只能修改本身的口令。

例如,要求建立一用戶名爲「user1」,口令爲「123」的新用戶,且該用戶所屬組的組名爲「group」,實現方法以下:

(1)用超級用戶身份登陸系統。

(2)創建用戶組「group」,鍵入命令「groupadd  group」。

(3)創建屬於用戶組「group」的新用戶「user1」,鍵入命令「useradd  -g  group  user1」。

(4)設置用戶「user1」的口令,鍵入命令「passwd  user1」,在系統提示下,輸入口令「123」二遍。

(5)檢查用戶「user1」是否成功建立,鍵入命令「ls  -l  /home」,可觀察到如圖2-1所示信息,說明屬於「group」組的用戶「user1」已創建。

 

圖2-1

 

例如,要求建立一用戶名爲「user2」,口令爲「456」的新用戶,且該用戶屬於組 「user2」。實現方法以下:

(1)以超級用戶身份登陸系統。

(2)創建用戶組「group」,鍵入命令「groupadd  user2」。

(3)建立屬於「user2」組的新用戶「user2」,鍵入命令「useradd  -g user2  user2」。

(4)設置用戶「user2」的口令,鍵入命令「passwd  user2」,在系統提示下,輸入口令「456」二遍。

(5)檢查用戶「user2」是否成功建立,鍵入命令「ls  -l  /home」,可觀察到如圖2-2所示信息,說明屬於「user2」組的用戶「user2」已創建。

 

 

圖2-2

2.1.4 刪除用戶

當肯定一用戶已再也不須要時,應將其刪除。因爲系統中的全部普通用戶均由超級用戶建立,因此用戶的刪除亦只能由超級用戶來完成。刪除用戶可以使用命令userdel來實現。下面介紹命令userdel的基本使用。

格式:

userdel  [-r]  <用戶名>

功能:

刪除由「用戶名」指定的用戶,即在「/etc/passwd」文件中將該用戶信息刪除。

選項說明:

-r:在刪除用戶信息的同時,將該用戶的工做目錄刪除,即將該用戶徹底刪除。缺省時僅刪除「/etc/passwd」文件中的用戶信息。

例如,要求將名爲「user2」的用戶徹底刪除。實現方法以下:

(1)以超級用戶的身份登陸。

(2)徹底刪除用戶「user2」,鍵入命令「userdel  -r  user2」。

(3)檢查用戶「user2」是否成功刪除,首先鍵入命令「cat  /etc/group |more」,可觀察到用戶「user2」的信息已不存在,而後鍵入命令「ls  -l  /home」,可觀察到用戶「user2」的工做目錄已不存在,說明用戶「user2」已徹底刪除。

 

 

2.2 Linux文件信息命令和基本文件管理

 

 

2.3 Linux文件權限

 

 

2.3.1 文件權限

Linux系統將全部可設置權限的用戶分紅文件主(即文件擁有者)、同組用戶和其餘用戶三種類別。

Linux系統對文件和目錄提供了r、w、x三種權限,但文件的權限和目錄的權限的含義是有所不一樣的,表2-3-1列出了三種權限用於文件和用於目錄時的意義。

 

2-3-1  Linux文件系統權限的意義

權限

用於目錄時的意義

用於文件時的意義

x

容許用戶進入目錄。只有擁有了「x」權限,下面介紹的「r」和「w」權限纔有意義。

容許執行文件。

r

容許顯示目錄中文件和目錄,但對該目錄還必須有「x」權限。

容許顯示文件內容。

w

容許在目錄中建立、刪除、更名目錄和文件,但對該目錄還必須有「x」權限。

容許改變文件內容。

 

此外,須要強調的是,在Linux中對普通文件的訪問權限還依賴於目錄文件的訪問權限。例如,一用戶對指定路徑下的文件雖然擁有寫訪問權限,但該用戶並不必定對此文件就可以寫訪問,只有當該用戶對此文件的訪問路徑上包含的全部目錄至少擁有「r-x」權限時,才真正可以對該文件寫訪問。

經過命令「ls  –l」,可查看文件或目錄的權限,命令列出的第一欄的十位字符中包含了文件類型和文件權限,現將第一欄十位字符的意義說明以下(其中X表示每一位字符):

 

X

X X X

X X X

X X X

 

Linux提供的常見文件類型有:

-:文件。

d:目錄。

 

十位字符中,除第一位表示文件類型外,其他九位表示文件的權限,三位一組分紅三組,依次表明文件主、同組用戶以及其餘用戶的三類不一樣用戶,每組中的三位,依次表示r、w、x權限。當對應的位置不顯示爲「-」時,表示該類用戶對此文件擁有相應的權限,反之,若對應的位置顯示爲「-」時,則表示該類用戶對此文件不擁有相應的權限。例如,用戶的權限爲「-rwxr-xr--」,則表示文件的用戶主對該文件擁有讀、寫和執行的權限,同組用戶對該文件則擁有讀和執行的權限,但不擁有寫的權限,其餘用戶對該文件只擁有讀的權限。在系統內部,這十位信息是用十位二進制來保存的。

2.3.2 設置文件權限

Linux提供了設置文件權限的一組命令,修改文件權限命令chmod,但這一命令只有文件主和超級用戶可使用。下面介紹chmod命令的基本使用。

 

格式一:chmod  {a,u,g,o} {+,-,=} {r,w,x}   <文件名>

 

格式二:chmod  nnn  <文件名>

 

功能:格式一是用字符r、w、x形式對由「文件名」指定的普通文件或目錄文件,向各用戶設置訪問權限。格式二是用nnn三位八進制數形式對由「文件名」指定的普通文件或目錄文件,爲各用戶設置訪問權限。

說明:

{a,u,g,o}:表示向由a,u,g,o指定的用戶設置文件的權限,各自的意義是,「a」表示全部用戶;「u」表示文件主;「g」表示同組用戶;「o」表示其餘用戶。

{+,-,=}:表示操做符,各自的意義是,「+」表示增長權限;「-」表示刪除權限;「=」表示賦予權限,即便「文件名」指定的文件或目錄只具備指定的權限。

{r,w,x}:表示讀、寫、執行權限。

nnn:三位八進制數依次對應於文件主、同組用戶和其餘用戶的權限。三位數字中的每一位對應各權限之和以下:

 

---

0

--x

1

-w-

2

-wx

3

r--

4

r-x

5

Rw-

6

rwx

7

 

例如,若nnn的值爲「754」,則對應的權限字符形式爲「rwxr-xr--」,表示文件的用戶主對文件擁有讀、寫和執行的權限;同組用戶對該文件則擁有讀和執行權限,但不擁有寫的權限;其餘用戶對該文件則只擁有讀的權限。

例如,要求將文件junk的讀訪問權限賦予全部用戶,則以超級用戶或文件主身份登陸系統,在shell提示符下,鍵入命令「chmod  a+r  junk」。

例如,要求對文件junk,刪除全部者之外的全部用戶的讀訪問權限,則在shell提示符下,鍵入命令「chmod  og-r  junk」。

 

例如,要求文件junk,除文件主具備讀、寫、執行權限外,其餘全部用戶只擁有讀訪問權限。

方法一:

在shell提示符下,鍵入命令「chmod  u + rwx,go = r  junk」。

方法二:

在shell提示符下,鍵入命令「chmod  744  junk」。

 

例如,要求將文件junk的讀、寫、執行權限賦予全部用戶。

方法一:

在shell提示符下,鍵入命令「chmod  a+rwx  junk」。

方法二:

在shell提示符下,鍵入命令:「chmod  777  junk」。

 

例如,要求撤消文件junk對其餘用戶已開放的全部權限。

在shell提示符下,鍵入命令「chmod  o=  junk」。

2.3.3 設置文件的擁有權

用戶除了可爲文件或目錄設置訪問權限外,還能夠更改文件或目錄的主和組,即用戶可將原來屬於本身的文件或目錄轉給他人。

 

1、更改文件和目錄所屬的主

chown命令可用來改變文件和目錄所屬的主,下面介紹chown命令的基本使用。

 

格式一:chown  [ -R ]  <用戶名>  <文件/目錄>

 

格式二:chown  [ -R ]  <用戶名:組名>  <文件/目錄>

 

說明:格式一是將「文件/目錄」指定的文件或目錄的擁有者更改成「用戶名」所指定的用戶。格式二是將「文件/目錄」指定的文件或目錄的擁有者更改成「用戶名」所指定的用戶,且同時將文件或目錄的所屬的組更改成「組名」所指定的組。

選項說明:

-R:改變整個目錄。

 

2、更改文件和目錄所屬的組

若是要改變文件或目錄所屬的組,則可用命令chgrp來實現,下面介紹chgrp命令的基本使用。

格式:

 

chgrp  <組名>  <文件/目錄>

 

說明:將「文件/目錄」指定的文件或目錄所屬的組更改成「組名」所指定的組。

選項說明:

-R:改變整個目錄。

 

例如,在目錄「/home/user1」下,有一名爲「myfile」的文件,文件的擁有者是「user1」,文件所屬的組是「user1」,現要求將該文件的擁有者改成「user2」,文件所屬的組更改成「user2」(假定用戶user2和用戶組user2均已存在),更改文件的擁有者和屬組的方法以下:

(1)以root身份登陸。

(2)鍵入命令「chmod  user2  /home/user1/myfile」。

(3)鍵入命令「chgrp  user2  /home/user1/myfile」。

或將(2)和(3)用命令「chmod  user2:user2  /home/user1/myfile」來完成。

 

2.4 思考題

一、如何實現普通用戶與超級用戶間的轉換?

二、使用命令shutdown,實現Linux的關閉與重啓

(1)五分鐘之後,關閉系統

(2)十五分鐘之後,關閉系統,而且在關閉後從新啓動系統

三、Linux文件與目錄

(1)用一條命令實現,列出 /home子目錄下的全部文件和子目錄(包括下級子目錄中的文件和子目錄)的詳細信息。

(2)用一條命令實現,列出 以/home爲起點的子樹中全部小寫字母開頭的文件的詳細信息。

(3)要求在用戶工做目錄 /home下,建立下圖所示的目錄樹(其中,文件的內容自定),在創建過程當中,要求:

① 用一條命令,實如今teachear目錄下,創建子目錄/a~/z

② 用一條命令,實現同時創建父子目錄student和stu1

③ 用一條命令,實現刪除目錄teacher

 

 

 

 

 

 

 /

user

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  /student

 

 

 

 

 

 

/teacher

 

 

 

 /other

 

 

 

 

 

 

     /stu1

 

 

 

 

 

 

 

 

 

 

 

 

 

 /a

 /b

   ……

 

 /z  file1

file2

file3

 

 

 

 

 

 

 

 

 

 

(4)顯示以目錄user爲起點的目錄樹圖形結構。

(5)用一條命令,實現顯示目錄 /etc下的全部文件和目錄,且經過特定的後綴字符,區分出目錄和文件及隱含文件、普通文件等信息。

(6)父目錄、子目錄及孫子目錄可否用一條命令同時創建?

(7)比較rmdir、rm命令,在刪除目錄功能上的區別。

(8)用命令more瀏覽ux內核文件 /usr/src/Linux/kernel/signal.c的內容,並搜尋其中「if」字符串。

四、Linux文件權限

(1)Linux中,將可設置文件權限的用戶分紅哪幾種?Linux向他們提供了哪些可設置權限?

(2)如何實現Linux的文件權限的修改?在修改時要注意什麼?

(3)在當前目錄下建立文件ex1,而後用chmod命令的二種格式分別修改ex1的文件權限,權限修改成:文件主享有全部權限,同組用戶和其餘用戶享有讀權限和執行權限。

(4)分析總結文件與目錄權限的依賴關係。

(5)寫出下面三位八進制數的權限意義及對應的字符形式的權限表示。

     77七、64四、75五、750、770

 


【實習報告】

實習報告:Linux命令接口使用

學生姓名:       班級:        學號:

 

1、實習內容

一、訪問Linux系統

    1. 登陸規則和口令規則

(1) 列舉至少2條Linux登陸ID的規則或者要求。

1) __________________________________________________________________

2) __________________________________________________________________

3) __________________________________________________________________

(2) 列舉至少3條Linux口令的規則或者要求。

1) __________________________________________________________________

2) __________________________________________________________________

3) __________________________________________________________________

4) __________________________________________________________________

    2. 登陸Linux

獲取用戶名和口令,在帶有GNOME登陸界面的Linux工做站上執行如下步驟完成本實驗環節:

步驟1:開機,啓動Red Hat Linux系統,在系統登陸界面的左下方單擊「會話」,在屏幕上彈出的菜單中選擇會話方式,咱們選擇「GNOME」,單擊「肯定」按鈕。

步驟2:使用分配的用戶名登陸。將這個用戶名輸入在歡迎界面的「用戶」輸入框中,回車後再輸入分配的口令並回車。系統顯示Red Hat Linux桌面。

步驟3:單擊屏幕左下方的紅帽子,在菜單中單擊「系統工具」-「終端」命令,顯示「終端」窗口。

步驟4:在命令行提示符 ($) 下輸入更改口令的命令。應該輸入的命令是什麼?

_________________________________________________________________

步驟5:系統提示:(current) UNIX password: ,輸入當前密碼 (注意區分大小寫) 。

步驟6:系統接着提示:New password,輸入新的密碼abc。是否可以把密碼改成abc?說出爲何可以或者爲何不能改?

_________________________________________________________________

步驟7:當再次出現提示符的時候,輸入另一個密碼abcdef。可以把密碼改成abcdef嗎?說出爲何可以或者爲何不能改?

_________________________________________________________________

步驟8:輸入新的密碼Linuxl23。

步驟9:從新輸入確認密碼。確認後收到了什麼信息?

_________________________________________________________________

步驟10:在命令行提示符 ($) 下鍵入Exit或者按下Ctrl和D鍵,關閉終端視窗。

     3. Linux系統中的Shell

在提示符下 (例如 $ ) 輸入:echo $SHELL並按回車鍵便可找出當前系統所使用的Shell。

_________________________________________________________________

若是更改系統的Shell,建議考慮bash,由於它的功能最強大,而且符合POSIX標準,並且在Linux上很是的流行。使用chsh命令可改變所使用的Shell。

    4. Linux系統中文件與目錄

咱們來了解Linux通配符的使用。

首先假設當前目錄下有五個文件 (inv1jig.c、inv2jig.c、inv3jig.c、invinitjig.c、invpar.c) ,而後執行操做:

       $ ls inv?jig.c

使用此命令將列出文件名中第四個字符包含數字的文件,結果包括:

_________________________________________________________________

執行操做:

       $ ls inv[13]jig.c

結果包括:

_________________________________________________________________

使用如下命令列出文件名中第四個字符爲1到3的文件:

       $ ls inv[1-3]jig.c

結果包括:

_________________________________________________________________

使用如下命令列出文件名中在inv和jig中間夾着任何長度字符串的文件:

       $ ls inv*jig.c

結果包括:

_________________________________________________________________

使用如下命令將列出文件名中至少包含一個數字而且擴展名爲「.c」或「.o」的文件:

       $ ls *[0-9]*.[co]

結果包括:

_________________________________________________________________

Linux中目錄的概念與DOS或Windows差很少,只是在DOS或Windows中目錄用「\」號表示,而在Linux則用「/」號表示。

與DOS或Windows同樣,Linux的目錄也能夠採用絕對與相對路徑表示。在Linux操做系統中,無論是文本模式仍是圖形模式,其全部的文件佈局都是樹型目錄方式。

爲返回工做目錄,不管如今處於何級目錄位置,只要鍵入「cd」命令便可返回登陸時的工做目錄。鍵入pwd,可查到當前工做目錄的徹底路徑。記錄下當前的工做目錄:

_________________________________________________________________

還能夠經過一個「~」字符來引用本身的主目錄,例如:

       /home/CAI $ ls ~class/

等價於

       /home/CAI $ ls /home/CAI/class/

    5. Linux的文件系統

1) 本次實驗使用的Linux系統的版本是:

_________________________________________________________________

2) 在Linux文件系統根目錄下有哪些子目錄:

_________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

(例如:bin、dev、etc、home、install、lib、mnt、proc、root、tmp、user、var,注意區分不一樣版本目錄的不一樣) 。

3) 用「ls  –f  /bin」命令列出 /bin系統目錄中的文件個數和主要文件:

___________________________________________________________     ______

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

   

二、Linux文件信息命令和基本文件管理

1. 文件信息命令

步驟1:開機,登陸進入GNOME。

在GNOME登陸框中填寫指導老師分配的用戶名和口令並登陸。

步驟2:訪問命令行。

單擊紅帽子,在「GNOME幫助」菜單中單擊「系統工具」-「終端」命令,打開終端窗口。

步驟3:使用控制字符執行特殊功能。

控制字符用來執行特殊的做業,如停止和啓動屏幕輸出。

大多數PC鍵盤有兩個控制鍵。它們一般標記爲Ctr1,能夠在鍵盤的左右下角找到。爲了輸入一個控制字符序列,可按住Ctrl鍵不放,而後按下鍵盤上相應的字符。

Ctrl + C:中斷當前活動。當你在csh中鍵入一個不可識別的命令行 (例如,$ls 「) ,收到第2個提示符的時候,Ctrl + C也能夠用於恢復shell提示符。

Ctrl + Z:終止當前活動。顯示ls命令的手冊頁面 (man ls) ,而後使用Ctrl -z停止輸出。

當你接下Ctrl + Z的時候,發生了什麼事情?

    _________________________________________________________________

Ctrl + D:表示文件的末尾或者退出。 Ctrl + D用於退出一些Linux工具程序 (bc、write等) ,退出一個終端窗口,註銷一個終端會話或者命令行登陸會話。做爲一個通常的規則,當您出現「死機」時,或者若是Ctrl + C不起做用,可試試Ctrl + D。例如:

1) 在shell提示符下鍵入bc,啓動基本的計算器工具程序。

2) 把兩個數字相乘 (鍵入:458*594,而後按回車鍵) 。

3) 按Ctrl + D退出計算器。

當使用計算器的時候,你的提示符是什麼?

    _________________________________________________________________

Ctrl + U :擦除整個命令行。Ctrl + U最經常使用在:

· 一個擦除決定不執行的命令行的快捷方式。

· 若是登陸到一個遠程系統,退格鍵不起做用。

· 它能夠確保在登陸的時候,從一個「空」的用戶賬號和口令輸入開始。

· 由於在口令輸入的時候看不見它們,當知道本身鍵入了錯誤字符的時候,使用Ctrl + U擦除密碼,從新開始輸入。

若是輸入一個命令,如ls –R/,有時候,會在按下回車鍵以前想擦除命令行。輸入一個命令,在接下回車鍵執行命令以前按下Ctrl + U。結果是什麼?

    _________________________________________________________________

_____________________________________________________________________

步驟4:使用file命令肯定文件類型。

在Linux系統中能夠找到許多類型的文件。文件類型能夠經過使用file命令來肯定。當一個用戶試圖打開或閱讀一個文件的時候,這個信息很重要。肯定文件類型能夠幫助一個用戶決定使用哪一個程序或命令來打開這個文件。這個命令的輸出最多見的是以下幾種:文本文件、可執行文件或數據文件。

1) 文本文件:包括ASCII或英語文本、命令文本和可執行的shell腳本。這種類型的文件可使用cat或more命令讀取,可使用vi或其餘文本編輯器編輯。

單擊紅帽子,在「GNOME幫助」菜單中單擊「輔助設施」-「Text Editor」命令,在文本編輯中鍵入適當內容並保存爲test文件。

使用file命令來肯定test文件的文件類型。它是哪一種類型的文件?

    _________________________________________________________________

2) 可執行 (或二進制) 文件:包括32位的可執行文件和可擴展連接格式(ELF) 編碼文件,和其餘動態連接的可執行文件。這種文件類型表示這個文件是一個命令或程序。

單擊紅帽子,在「GNOME幫助」菜單中單擊「辦公」-「OpenOffice.org Writer」命令,創建一個文檔如ww.sxw。

使用file命令肯定你所創建的文件類型。它是哪一種類型的文件?(注意文件名部分必須包括擴展名,如file ww.sxw 。)

    _________________________________________________________________

3) 數據文件:數據文件是由系統中運行的應用建立的。在某些狀況下,文件的類型是會說明的。例如,FrameMaker (桌面印刷軟件) 文檔。

使用file命令肯定dir1/coffees子目錄中beans文件的文件類型。它是什麼文件類型的?

    _________________________________________________________________

步驟5:使用strings命令。

strings命令能夠用於打印可執行文件或者二進制文件中的可讀字符。

一些有編程背景的人,能夠解釋strings產生的輸出。這個命令在這裏只是做爲一個展現可執行文件中可打印字符的方法來介紹。strings命令必須用於讀取可執行文件,如 /usr/bin/cat。在大多數狀況下,strings命令也能夠給出命令的使用語法。

使用strings命令查看 /usr/bin/cal文件的可讀字符。列出strings命令中的一些輸出。

    _________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

步驟6:使用cat命令顯示文件的內容。

cat命令在屏幕上顯示一個文本文件的內容。它經常使用於顯示如腳本文件 (相似批處理文件) 這樣的短文本文件。若是文件超過一屏的話,必須使用一個屏幕能夠滾動的窗口,如GNOME環境中的終端窗口。

鍵入 ls /dev > dev1

使用cat命令顯示主目錄中dev1文件的內容。文本的顯示出現了什麼狀況?

    _________________________________________________________________

步驟7:使用more命令顯示文件的內容。

more命令是一個用於顯示文本文件首選的方法,由於它會自動的一次顯示一屏文件內容。若是文件的信息比一屏更長,屏幕的底部顯示以下的信息:--More-- (n%) (文件的n%已經顯示) 。按下回車鍵,繼續一次顯示一行信息。空格鍵將繼續一次顯示一屏內容。

使用more命令顯示主目錄中dev1文件的內容。文本的顯示出現了什麼狀況?

    _________________________________________________________________

步驟8:使用head命令顯示文件的一部分。

head命令用於顯示一個或多個文本文件的前n行。在默認狀況下,若是沒有給出 -n選項,將顯示前10行。當您只想查看文件的開始的幾行,而無論文件的大小的時候,head命令是頗有用的。

1) 單獨使用head命令,顯示主目錄中dev1文件的開始部分。顯示了多少行?

    _________________________________________________________________

2) 使用帶 -n選項的head命令,顯示主目錄中dante文件的前20行。您輸入什麼命令?

    _________________________________________________________________

步驟9:使用tail命令顯示文件的一部分。

使用tail命令,顯示文件的最後幾行。在默認狀況下,若是沒有指定 -n選項,將顯示最後10行。當檢查大型日誌文件最近輸入內容的時候,tail命令是頗有用的。備份工具程序常把備份哪一個文件和何時作的備份,寫到日誌文件中去。一個備份日誌文件中最後的輸入一般是備份文件的總數和備份是否成功完成的信息。-n選項顯示了文件的最後n行。

單獨使用tail命令,顯示主目錄中dante文件的末端。顯示了多少行?

    _________________________________________________________________

步驟10:經過使用wc命令,肯定行數、單詞數和字符數。

wc (單詞計數) 命令能夠用於顯示文本文件的行數、單詞數、字節數或者字符數。當肯定文件特徵或者當比較兩個文件的時候,這個命令是頗有用的。使用不帶選項的wc將給出文件的行數、字節數。使用帶一個選項的wc,能夠肯定想查看的哪一項內容。

使用wc命令肯定主目錄中dev1文件的行數、單詞數和字符數。有多少行、多少個單詞和多少個字符?

    _________________________________________________________________

步驟11:使用wc計算目錄條目的數目。

使用wc和ls命令肯定主目錄中條目 (文件和目錄) 的數目。爲此,必須把ls命令的輸出導入到wc命令中。

更多符號是豎線,和後斜線 (\) 在同一個鍵上。在命令行提示行下,輸入命令ls l wc -w。有多少個文件和目錄名 (單詞) ?

    _________________________________________________________________

步驟12:使用diff命令肯定文件之間的不一樣之處。

diff (不一樣) 命令用於比較2個文本文件,找出在它們之間的不一樣之處。wc命令能夠比較文件,由於它計算行數、單詞數和字符數。有可能2個文件有相同的行數、單詞數和字符數,可是字符和單詞不一樣。diff命令能夠從實際上找出文件之間的不一樣。

這個命令的輸出把2個文本文件之間的不一樣一行一行的顯示出來。diff命令有2個選項:-i 和 -c。-i選項忽略字母的大小寫,例如A和a相等。-c選項執行細緻的比較。

單擊紅帽子,在「GNOME幫助」菜單中單擊「輔助設施」-「Text Editor」命令,建立兩個文件fruit1和fruit2,並鍵入適當內容。

使用diff命令執行細節比較,肯定fruit1文件和fruit2文件之間的區別。

在fruit1文件和在fruit2文件中,哪幾行是不一樣的?

    _________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

1) cat命令:

· 對fruit1文件使用cat命令。

· 對fruit2文件使用cat命令。

· 鍵入命令行cat fruit1 fruit2 > filex。

· 對filex文件使用cat命令。上面的命令行作了什麼工做?

    _________________________________________________________________

2) 可使用哪2個命令來肯定2個文件是否相同?

    _________________________________________________________________

步驟13:關閉終端窗口,註銷。

    2. 基本的命令行文件管理

步驟14:回顧Linux的文件和目錄命名規則。

在本實驗中,咱們將建立文件和目錄,所以,在開始以前,先來回顧一下Linux文件和目錄的命名規則和指導方針。

1) 最大長度:組成文件和目錄名最大長度爲255個數字字母字符。通常來講,應該儘量的保持文件名短可是仍然有意義。

2) 非數字字母字符:一些非數字字母字符或者元字符是可用的:下劃線 (_) 、連字符號 (-) 和句點 (.) 。這些元字符能夠在文件或目錄名中使用屢次(Feb.Reports.Sales是一個有效的文件或目錄名) 。儘管shell容許把星號 (*) 、問號(?) 和發音符號 (~) 、方話號 ([ ]) 、&、管道 [ | ] 、引號 (「」) 和美圓符號 ($) 在文件名中使用,但這不是推薦的,由於這些字符對於shell有特殊的意義。分號 (;) 、小於號 (<) 和大於號 (>) 是不容許做爲文件名的。

3) 文件名擴展:文件名能夠包含一個或多個擴展名。擴展名常被一個應用追加到文件的末端。擴展名一般是1個到3個字符,追加到文件名的末端,以前有一個句點 (.) 。當命名文件的時候,您能夠選擇使用這個規則。

4) 目錄名的擴展名:目錄名通常不包含擴展名,可是也沒有規則反對這一點。

5) 大小寫敏感:Linux文件和目錄名是大小寫敏感的。Project1和projectl不是同一個文件。在一個目錄中,不可以有兩個文件有着一樣的名字。通常規則都是使用小寫字母。

檢查表7-1中的文件名,指出它們是不是有效或者推薦的Linux文件或目錄名,爲何是或爲何不是。

 

表7-1  實驗記錄

文件名

是否爲Linux文件或目錄名

爲何是或爲何不是

12345abcde678

 

 

Hobbies: 2

 

 

Adcd-123

 

 

Sales*repts*2001

 

 

D.projects.bj.2001

 

 

Projects>1.bj-2001

 

 

 

步驟15:使用touch命令建立文件。

每次建立一個新的字處理文檔或者電子數據表,就是正在建立一個新文件,應該符合以前提到的文件命名規則。也必須擁有建立文件的目錄的足夠權限。

使用touch命令,能夠同時建立一個或多個文件。一些應用要求在寫文件以前,文件必須存在。touch命令對於快速建立須要處理的文件頗有用。也可使用touch命令更新文件被訪問的時間和日期,使文件能夠再次被備份。當建立文件或目錄的時候,能夠指定絕對和相對的路徑名。

命令格式:

touch filename (s)

1) 在主目錄中使用touch命令建立一個名爲newfile的文件,應該使用什麼命令?

    _________________________________________________________________

2) 使用touch命令在這個目錄中建立另外一個叫作filenew的新文件,應該使用什麼命令?

    _________________________________________________________________

3) 輸入命令顯示practice目錄中的文件的長列表。建立的文件列出來了嗎?

    _________________________________________________________________

4) 誰是文件的全部者?

    _________________________________________________________________

5) 和文件關連的組是什麼?

    _________________________________________________________________

6) 建立的日期和時間是什麼?

    _________________________________________________________________

7) 文件的大小是多少?

    _________________________________________________________________

8) 使用file命令肯定newfile的文件類型。它是哪一類的文件?

    _________________________________________________________________

9) 使用touch命令同時建立3個文件:new一、new2和new3,應該使用什麼命令?

    _________________________________________________________________

10) 輸入命令顯示practice目錄中文件的長列表。建立的3個新文件列出來了嗎?

    _________________________________________________________________

步驟16:使用mkdir命令建立新目錄。

mkdir (建立目錄) 命令用於建立目錄或文件夾。目錄能夠包含其餘目錄,稱爲子目錄,它們能夠包含文件。

    目錄可使用或者絕對路徑名或者相對路徑名建立。能夠在同一行中指定多個目錄名,建立多個新目錄。必須有建立目錄的足夠權限。

mkdir directory_name (s)

1) 從主目錄中,使用相對路徑名改變到practice目錄中。使用什麼命令?

    _________________________________________________________________

2) 使用mkdir命令,在這個目錄中建立一個叫作newdir的子目錄。使用什麼命令?

    _________________________________________________________________

3) 輸入命令,顯示practice目錄中文件和目錄的長列表。建立的目錄列出來了嗎?

    _________________________________________________________________

4) 目錄的全部者是?

    _________________________________________________________________

5) 文件的大小是多少?

    _________________________________________________________________

6) 使用file命令肯定newdir文件的類型。它是哪一類的文件?

    _________________________________________________________________

7) 若是名字中沒有字符dir,採起別的什麼方法來識別出它是一個目錄?

    _________________________________________________________________

8) mkdir命令建立3個目錄,目錄名分別爲high、medium和low,應該使用什麼命令?

    _________________________________________________________________

9) 用ls命令檢查建立是否成功?

步驟17:使用rm命令刪除文件。

rm目錄能夠刪除單個文件或多個文件。能夠經過在rm命令以後指定文件的名字,或者使用星號 (*) 和問號 (?) 元字符,同時刪除幾個文件。在Linux系統中刪除的文件是永遠被刪除了,除非使用圖形界面刪除文件,它們纔可以被恢復。rm命令能夠帶 –i (交互) 選項使用,它在刪除文件以前會提示用戶。使用rm -i命令做爲防範,避免誤刪文件:

rm [-i] filename (s)

1) 使用rm命令刪除早先在practice目錄中建立的newfile文件,應該使用什麼命令?

    _________________________________________________________________

2) 輸入命令顯示practice目錄中文件的長列表。建立的文件還在嗎?

    _________________________________________________________________

3) 使用帶 -i選項的rm命令,刪除早先在practice目錄中建立的filenew文件。交互式選項起到什麼做用?

    _________________________________________________________________

4) 刪除早先建立的三個名爲new一、new2和new3的文件。使用問號 (?) 通配符使用一個命令刪除全部三個文件。使用什麼命令?

    _________________________________________________________________

5) 輸入命令,顯示practice目錄中文件的長列表。三個文件還在嗎?

    _________________________________________________________________

6) 還有其餘的什麼方法來刪除new一、new2和new3文件?

    _________________________________________________________________

步驟18:使用rm -r命令刪除目錄。

rm -r目錄用於刪除目錄。它將刪除從目標目錄開始的目錄,包括全部的子目錄和文件。當rm命令帶 -r信息使用的時候,它能夠刪除單個目錄 (空或不空) 或目錄樹的整節。rm命令能夠帶 -i選項使用,它在刪除目錄以前會提醒用戶:

rm –r [i] directory_name (s)

1) 刪除早先建立的newdir子目錄,使用什麼命令?

    _________________________________________________________________

2) 輸入命令顯示practice目錄中文件的長列表,建立的子目錄還在嗎?

    _________________________________________________________________

3) 改變到早先建立的mediurn子目錄中,輸入什麼命令?

    _________________________________________________________________

4) 刪除早先建立的low子目錄,使用什麼命令?

    _________________________________________________________________

5) 用相對路徑名和快捷方式,改變回到practice子目錄中,應使用什麼命令?

    _________________________________________________________________

6) 使用一個命令刪除high和medium子目錄,應使用什麼命令?

    ____________________________________________________________________

步驟19:練習所學習到的內容。

經過在practice目錄中建立一個三級的目錄樹,練習使用touch、mkdir和rm命令。試着使用有意義的目錄名。記住可使用一個命令建立整個目錄結構。在每一個目錄中建立多個文件。記住可使用一個命令建立多個文件。

結束的時候,請刪除實驗時建立的文件和目錄。

步驟20:關閉終端窗口,註銷。

 

 

 

 

三、Linux文件權限

 

  1. 肯定文件系統權限及在命令行中修改權限

步驟1:開機,登陸進入GNOME。

在GNOME登陸框中填寫指導老師分配的用戶名和口令並登陸。

步驟2:訪問命令行。

單擊紅帽子,在「GNOME幫助」菜單中單擊「系統工具」-「終端」命令,打開終端窗口。

步驟3:顯示權限。

權限控制着誰可以對文件系統中的文件和目錄作什麼。目錄和文件權限可使用帶 –l (長列表) 選項的ls (列表) 命令來肯定。ls -l命令顯示目錄內容的長列表。若是同時給出 -a選項,則全部文件,包括隱藏文件和目錄 (那些以圓點打頭的) 都被顯示出來。

表8-2提供了檢查使用ls -l目錄列出的信息。

 

表8-2

文件類型

第一個位置的短橫線表示一個普通文件。一個d表示目錄

權限

3組權限:用戶,屬組,其餘

連接

連接到其餘文件和目錄

全部者

建立文件或目錄的用戶的用戶 (登陸ID) ,除非指派了全部權

屬組

全部者屬於的屬組名,由系統管理員創建

大小

文件按字節計算的大小

修改日期/時間

文件建立或最後修改的月、日、年 (若是不是當年) 和時間

文件名

文件或目錄名

 

    注意當使用權限工做的時候,文件類型、權限、全部者、屬組和文件/目錄名是列表中最重要的信息片段。

 

1) ls 的第一個位置______________對文件或目錄列表______________表示文件類型。使用ls –l命令列出主文件夾中的文件。/bin/cal的文件類型是什麼 (文件或目錄) ?如何知道的?

    _________________________________________________________________

2) 接下來的ls中的9個位置______________表示文件的權限。全部文件或目錄可能的權限是:(小寫) r、w、x或短橫線 (-) 。cal的權限是什麼?

    _________________________________________________________________

步驟4:解釋權限。

請參閱表8-3,回答下面的問題。注意到權限的解釋對於文件和目錄是不一樣的。

1) 文件的r權限的意義是什麼?

    _________________________________________________________________

_____________________________________________________________________

2) 目錄的r權限的意義是什麼?

    _________________________________________________________________

_____________________________________________________________________

 

表8-3  普通文件目錄的權限符號

權限

符號

普通文件

目錄

r

文件能夠被顯示或者拷貝 (拷貝的文件屬於新的全部者) 。只有讀權限不可以刪除或移動文件

可使用ls命令列出內容。必須也有使用ls命令選項的執行權限

w

文件能夠被修改、移動和刪除 (只有當目錄給出寫權限的時候)

文件能夠被添加或刪除。目錄必須也有執行權限

執行

x

文件能夠被執行 (shell腳本或者可執行文件)

控制對目錄的訪問。用戶能夠cd到目錄中,使用讀訪問列出其中的內容。文件可使用寫訪問被移動或者拷貝到目錄中

無權限

-

短橫線表示權限被拒絕

短橫線表示權限被拒絕

 

3) 文件的X權限的意義是什麼?

    _________________________________________________________________

4) 文件的w權限的意義是什麼?

    _________________________________________________________________

5) 目錄的w權限的意義是什麼?

    _________________________________________________________________

6) 權限位置的短橫線 (-) 的意義是什麼?

    _________________________________________________________________

步驟5:肯定文件的用戶權限。

九個權限被分紅三個權限一組。每組的三個權限老是按照r (讀) w (寫) 和x (執行) 的順序排列。若是權限不容許,短橫線 (-) 將在它的位置。第1組三個權限是用戶的權限組。這些權限決定其全部者可以作什麼。

在主目錄中建立一文件dante。單擊紅帽子,在「GNOME幫助」菜單中單擊「輔助設施」-「Text Editor」命令,在文本編輯中鍵入適當內容並保存爲dante。

1) 誰是dante文件的全部者?

    _________________________________________________________________

2) 用戶權限的頭2個字符是什麼?

    _________________________________________________________________

3) 在用戶的權限組中,第3個位置是什麼?

    _________________________________________________________________

4) 列出根據所給的文件權限,用戶 (全部者) 可以作的4件事情。

    _________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

步驟6:肯定文件的屬組權限。

系統管理員給每個用戶分配了一個主屬組。這個文件全部者所在的屬組是一個當該文件建立時,隨全部者一塊兒分配的成員。第2組的3個權限決定了主屬組的成員可以作什麼。

1) dante文件的全部者是什麼主屬組的成員?

    _________________________________________________________________

2) 屬組權限的第一個字符是什麼?

    _________________________________________________________________

3) 這容許屬組的其餘成員對文件進行什麼操做?

    _________________________________________________________________

4) 爲何在接下來的第二和第三個位置不是w和x,而是短橫線?

    _________________________________________________________________

步驟7:肯定文件的其餘 (公共) 權限。

最後一組字符,叫作其餘權限,是其餘每個人都有的權限。其餘指既不是文件全部者也不是文件全部者所在屬組的成員,可是有權訪問系統的全部人。

不是全部者和屬組的其餘人對dante文件有什麼權限?

    _________________________________________________________________

步驟8:肯定可執行文件的文件權限。

可執行文件,例如Linux工具程序和腳本文件,對於想執行命令或者腳本的全部人要求 (執行) 權限。

1) 從主目錄中顯示在 /usr/bin目錄中的bc文件的長目錄列表。使用什麼命令?

    _________________________________________________________________

2) 文件的權限是什麼?

    _________________________________________________________________

3) 用戶權限是什麼?

    _________________________________________________________________

4) 屬組權限是什麼?

    _________________________________________________________________

5) 其餘權限是什麼?

    _________________________________________________________________

6) 爲何組屬用戶和其餘用戶類別沒有w (寫) 權限?

    _________________________________________________________________

步驟9:使用默認權限建立一個新文件。

使用默認權限建立新文件。使用touch命令在主目錄中建立一個新文件。

1) 在主目錄中建立一個叫作newfileperms的新文件。使用什麼命令和路徑名?

    _________________________________________________________________

2) 查看newfileperms的權限。使用什麼命令和路徑名?

    _________________________________________________________________

3) 分配給這個文件的默認權限是什麼?

    _________________________________________________________________

4) 誰是全部者?

    _________________________________________________________________

5) 誰是主屬組?

    _________________________________________________________________

6) 主屬組的成員可以從新命名這個文件嗎?

    _________________________________________________________________

步驟10:使用默認權限建立一個新目錄。

也可使用不一樣的默認權限建立新目錄。使用mkdir命令在主目錄中建立一個新目錄。

1) 在主目錄的practice目錄中建立一個叫作newdirperms的新目錄。使用什麼命令和路徑名?

    _________________________________________________________________

2) 列出主目錄中的內容,查看newdirperms的權限。使用什麼命令和路徑名?(注:先退回到主目錄的上級目錄中。)

    _________________________________________________________________

3) 分配給這個目錄的默認權限是什麼?

    _________________________________________________________________

4) 誰是全部者?

    _________________________________________________________________

5) 誰是主屬組?

    _________________________________________________________________

6) 一個主屬組的成員可以在這個目錄中添加文件嗎?

    _________________________________________________________________

步驟11:回顧chmod命令模式。

chmod (修改模式) 命令被文件全部者 (或超級用戶) 用來修改文件權限。chmod命令的2種操做模式是符號 (或相對) 和八進制 (或絕對) 。chmod命令通用的格式是:

  chmod mode filename

模式部分會根據是使用符號模式仍是使用八進制模式而作修改。

· 符號模式:使用字母與符號的組合,爲不一樣類別的用戶添加或刪除權限。符號模式也叫作相對模式。

· 八進制模式:使用數字表示文件權限。八進制模式也叫作絕對或者數字模式。

1) 哪一種chmod模式使用數字表示文件權限?

    _________________________________________________________________

2) 哪一種chmod模式使用字母 (或符號) 表示權限?

    _________________________________________________________________

步驟12:使用符號模式修改文件權限。

當 使用符號模式設定權限的時候,儘管會同時給全部類別的用戶一樣的權限,通常只對一種類別的用戶工做。這個模式叫作相對模式,由於正在相對已經存在的權限進 行分配或刪除權限。能夠給一個特定類別的用戶添加或刪除一個或多個權限,或者把權限都取走。符號模式的命令格式使用字母和符號。命令格式的模式部分由3個部分組成:

· 誰:要處理的用戶的類別:u = 用戶,g = 屬組, o = 其餘,還有a = 全部。

· 操做:操做或者想作的事情:設定 (=) ,刪除 (-) ,給予 (+) 。

· 權限:分配的權限:r = 讀,w = 寫,還有x = 執行。

下面的例子刪除 (-) 了文件dante中其餘 (o) 類別用戶的讀 (r) 權限。 注意:在o 短橫線 (-) 和r之間沒有空格。

  chmod o-r dante

下面的例子給文件dante添加 (+) 了屬組 (g) 和其餘 (o) 類別用戶的寫 (w) 權限:

  chmod go+w dante

1) 在主目錄中使用相對路徑名建立一個叫作chmoddir的新目錄。使用什麼命令建立目錄?

    _________________________________________________________________

2) 改變到chmoddir目錄中,建立一個叫作symfile的新文件。使用什麼命令建立文件?

    _________________________________________________________________

3) 使用ls -l命令來肯定symfle的權限。這些是文件的默認權限。用戶、屬組和其餘的權限是什麼?

    _________________________________________________________________

4) 決定不想讓其餘用戶 (除了本身和屬組成員以外) 可以查看symfle的內容和拷貝symfle。使用chmod命令,在符號模式下,刪除其餘用戶對於文件symfle的讀權限。使用什麼命令?

    _________________________________________________________________

5) 再次列出文件的權限。其餘類別用戶的權限如今是什麼?

    _________________________________________________________________

6) 若是想只使用一個命令刪除屬組和其餘類別的讀權限,使用什麼命令?

    _________________________________________________________________

步驟13:使用符號模式修改目錄權限。

1) 改變回到主目錄,使用什麼命令?

    _________________________________________________________________

2) 從主目錄中列出早先建立的新的chmoddir目錄的權限。這些是目錄的默認權限。用戶、屬組和其餘的權限是什麼?

    _________________________________________________________________

3) 除了本身或者屬組成員之外的其餘用戶可以從chmoddir目錄中拷貝文件嗎?

    _________________________________________________________________

爲何能或者爲何不能?

    _________________________________________________________________

4) 不想讓其餘用戶從chmoddir目錄中拷貝文件。改變到主目錄中,使用chmod命令,在符號模式下,刪除其餘類別用戶對於目錄chmoddir的讀和執行權限。使用什麼命令?

    _________________________________________________________________

5) 再次列出目錄的權限。其餘類別用戶的權限是什麼?

    _________________________________________________________________

6) 主屬組成員可以在你的chmoddir目錄中建立或者拷貝文件嗎?爲何能或者爲何不能?

    _________________________________________________________________

_____________________________________________________________________

7) 改變到主目錄,使用chmod命令,在符號模式下,給主屬組去除對目錄chmoddir的讀權限。使用什麼命令?

    _________________________________________________________________

8) 經過使用符號模式把權限改回默認的權限。使用什麼命令?(提示:屬組和權限可使用一個命令組合,或者可使用2個分離的命令。)

    _________________________________________________________________

步驟14:肯定八進制權限。

    八進制模式爲同時修改全部類別用戶的權限提供了一個快捷的數字方式,並且仍然容許每組權限能夠是不一樣的。有3組可能的權限 (r、w和x) ,對應於每種用戶類別 (用戶、屬組或其餘) 。每組權限能夠根據容許的權限使用數字 (0到7) 來分配。

r (讀) 權限指派爲數字4,w (寫) 權限指派爲數字2,x (執行) 權限指派爲數字1。經過添加數字,咱們獲得一個總的對應於用戶類別 (用戶、屬組或其餘) 的3個權限。例如,若是用戶 (全部者) 對於文件的權限是rwx,咱們把4 (讀) 加上2 (寫)加上1 (執行) 獲得7。若是屬組有rw權限,它們獲得4+2+0 (沒有執行權限) 的總數6。若是其餘只有r權限,它們獲得4+0+0 (沒有寫和執行權限) 的總數4。這個文件或目錄的octal_mode是764。

1) 經過把字符權限轉換成等效的八進制,填入表8-4。先轉換每組權限 (用戶、屬組或其餘) ,而後在八進制模式權限下輸入octal_mode (3個數字) 。

 

表8-4  實驗記錄

用戶權限

八進制數

屬組權限

八進制數

其餘權限

八進制數

八進制

模式權限

r w x

 

r w -

 

r w -

 

 

r w -

 

r - -

 

r - -

 

 

r - -

 

r - -

 

r - -

 

 

r w x

 

r – x

 

r – x

 

 

 

步驟15:使用八進制模式修改文件權限。

使用八進制模式,沒有必要指定用戶的類別,由於每一個數字的位置表示了三種用戶類別中的一種。Octal_mode由三個數字組成,每一個都是一種用戶類別 (用戶、屬組或其餘) 的總和。八位數值組合在一塊兒標識了用於chmod命令的octal_mode。

  chmod octal_mode filename

1) 改變到chmoddir目錄中,建立一個叫作octfile的新文件。使用什麼命令建立文件?

    _________________________________________________________________

2) 使用ls -l命令來肯定octfile的權限。這些是文件的默認權限。什麼是用戶、屬組和其餘的數字權限?

    _________________________________________________________________

3) 與這個文件的用戶、屬組和其餘權限等同的八進制模式是什麼?

    _________________________________________________________________

4) 決定不想讓其餘用戶可以查看或者拷貝octfile文件的內容。使用chmod命令,在八進制模式下,刪除其餘用戶對於octfile的r (讀) 權限。使用什麼命令?

    _________________________________________________________________

5) 再次列出文件的權限。其餘用戶類別如今的權限是什麼?

    _________________________________________________________________

6) 若是想只使用一個命令,刪除屬組和其餘類別的全部權限,使用什麼命令?

    _________________________________________________________________

步驟16:使用八進制模式修改目錄權限。

下面的格式用於修改目錄的權限。-R (遞歸) 選項修改指定目錄的權限,包括其中的全部子目錄和文件。

  chmod [-R] octal_mode directoryname

1) 改變到主目錄。使用什麼命令?

    _________________________________________________________________

2) 從主目錄中列出chmoddir目錄的權限。這些是目錄的默認權限。對於用戶、屬組和其餘,數字極限是什麼?

    _________________________________________________________________

3) 什麼是和用戶、屬組和其餘對於這個目錄等同的八進制模式?

    _________________________________________________________________

4) 使用chmod命令,在八進制模式下,刪除其餘類別用戶對於目錄chmoddir的讀和寫權限。使用什麼命令?(記住:在八進制模式下,必須老是指定全部的3組權限,即便它們可能沒有被修改。)

    _________________________________________________________________

5) 再次列出目錄的權限。其餘用戶類別的權限如今是什麼?

    _________________________________________________________________

用戶和屬組的權限保持不變嗎?

    _________________________________________________________________

6) 全屬組 (核心組) 成員可以在chmoddir目錄中建立新文件或者拷貝文件嗎?爲何能或者爲何不能?

    _________________________________________________________________

_____________________________________________________________________

7) 決定讓屬組成員可以從你的目錄中拷貝文件。改變到主目錄,使用chmod命令,在八進制模式下,給主屬組 (核心組) 添加對目錄chmoddir的寫權限。用戶有權限rwx,屬組應該有權限rw,其餘應該對目錄沒有權限。使用什麼命令?

    _________________________________________________________________

8) 使用八進制模式把權限改回默認權限 (rwxr-xr-x) 。

    _________________________________________________________________

步驟17:建立一個腳本文件,使它可以執行。

在本步驟中,將使用vi編輯器建立一個簡單的文本腳本文件。爲了可以運行腳本文件,而後須要使它能夠執行。腳本文件在幫助自動重複做業的時候很是有用。

1) 改變到chmoddir目錄,使用vedit啓動vi編輯器。當啓動編輯器的時候,指定或者打開一個新文件叫作myscript。按下i進入插入輸入模式,以小寫文本鍵入下面的命令。在每行後按回車鍵。

  echo  「hello!」

2) 按下ESC鍵,返回命令模式,而後輸入一個冒號,進入末行模式。按下wq來寫入 (保存) 文件,而後退出vi。

    _________________________________________________________________

3) 列出文件,肯定它的權限。它們是什麼?

    _________________________________________________________________

4) 鍵入 ./myscript,就像它是一個命令,而後按下回車鍵。命令的響應是什麼?

    _________________________________________________________________

爲何它不執行?

    _________________________________________________________________

5) 修改myscript的權限,這樣用戶權限包括x (執行) ,做爲全部這能夠執行或運行文件。可使用符號模式或者八進制模式。使用什麼命令修改權限?

    _________________________________________________________________

6) 列出文件,檢查修改的權限。用戶 (全部者) 如今的權限是什麼?

    _________________________________________________________________

7) 再次把myscript做爲一個命令鍵入,而後按下回車鍵。命令的響應是什麼?

    _________________________________________________________________

步驟18:刪除在本實驗中建立的文件和目錄。

刪除在本實驗過程當中在你的主目錄中建立的全部文件和目錄。

步驟19:關閉終端窗口,註銷。

    2. 使用文件管理器修改權限

步驟1:登陸進入GNOME。

步驟2:訪問文件管理器。

文件管理器能夠經過雙擊桌面上的起始目錄圖標,打開一個主文件夾中的文件夾視圖。從那個文件夾能夠改變到其餘文件夾中,沿着層次結構向上或者向下,查看每一個文件夾的內容。路徑老是顯示在文件管理器窗口的「位置」區域。

雙擊桌面上的起始目錄圖標,當前文件夾的路徑是什麼?

    _________________________________________________________________

步驟3:使用文件管理器查看和修改文件權限。

能夠從文件管理器窗口中選擇文件或文件夾,單擊鼠標右鍵,單擊Properties命令,在「屬性」對話框中查看和修改它們的屬性。單擊「權限」按鈕,能夠查看和修改權限。爲了給全部者 (用戶) 、屬組和其餘修改權限,可經過單擊確認框選擇想要的權限。

1) 右鍵單擊dante文件,單擊Properties命令,而後單擊「權限」按鈕。dante文件的權限是什麼?

    _________________________________________________________________

2) 在主目錄中,使用File菜單建立一個叫作fmfile的新文件。右鍵單擊這個文件,單擊Properties命令,在「屬性」對話框中單擊「權限」按鈕。這個文件的權限是什麼?

    _________________________________________________________________

3) 在設定其餘用戶讀訪問的確認框上單擊,取消選擇 (清除確認標記) 。除了你本身或者屬組員以外的用戶如今還能查看這個文件的內容嗎?

    _________________________________________________________________

關閉fmfile的屬性窗口。

4) 使用文件管理器,瀏覽 /usr/bin文件夾的文件系統結構。定位cal命令文件。文件圖標上的符號是什麼?

    _________________________________________________________________

5) 右鍵單擊cal文件,單擊Properties命令,在「屬性」對話框中單擊「權限」按鈕。cal文件的權限是什麼?

    _________________________________________________________________

6) 如今已經看到這個文件的權限,你認爲那個圖標表示什麼意思?

    _________________________________________________________________

7) 單擊設定其餘用戶讀訪問的確認框,取消選擇 (清除確認標記) 。可以這樣作嗎?

    _________________________________________________________________

8) 關閉cal文件的屬性窗口。

步驟4:使用文件管理器檢查和修改文件夾權限。

1) 使用文件管理器,瀏覽主文件夾,建立practice文件夾。右鍵單擊practice文件夾,單擊Properties命令,在「屬性」對話框中單擊「權限」按鈕。practice文件夾的權限是什麼?

    _________________________________________________________________

2) 改變到practice文件夾,建立一個叫作fmfolder的新文件夾。右鍵單擊這個文件夾,單擊Properties命令,在「屬性」對話框中單擊「權限」按鈕。這個文件夾的權限是什麼?

    _________________________________________________________________

3) 單擊設定其餘用戶讀訪問和執行訪問的確認框,取消選擇 (清除確認標記) 。如今除了你本身或者你的屬組員以外的其餘用戶還可以查看這個文件夾的內容或者從其中拷貝文件嗎?

    _________________________________________________________________

4) 單擊設定你的屬組 (核心組) 寫訪問的確認框,進行選擇 (添加確認標記) 。你的屬組員可以修改fmfolder中的文件了嗎?

    _________________________________________________________________

5) 關閉fmfolder的屬性窗口。

6) 使用文件管理器,瀏覽 /root文件夾。這個文件夾圖標上的符號是什麼?表示什麼意思?

    _________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

步驟5:刪除全部在本實驗過程當中在你的主目錄中建立的文件和目錄。

步驟6:關閉GNOME文件管理器,註銷並退出

 

 

 

2、實習總結

 

 

 


Unit 3  Linux vi的使用

【實習要求】

掌握vi編輯器的基本使用

    包括:啓動、退出、增、刪、改、複製、粘貼、查找、替換等基本操做

 

【實習內容】

 

Linux vi編輯器

 

【實習指導】

 

vi是全部Linux發行版中均提供的一個標準的全屏幕編輯器,它具備強大的文本編輯功能。下面僅對其最基本功能進行介紹。

3.1 vi的啓動與退出

1vi的啓動

在shell提示符下,啓動vi編輯器的命令的基本格式以下:

格式:vi  [filename]

功能:啓動vi編輯器,且同時打開由filename指定的文件。若filename指定的文件不存在,則vi新建該文件;若命令中缺省filename,則vi新建一文件,在退出 vi前要求用戶給出該新文件的命名。

例如,在shell提示符下,鍵入以下命令「vi  /home/user/test1」,屏幕顯示如圖3-1所示,圖中「~」表示該行爲空行,還未使用。

 

 

圖3-1

 

vi提供了三種編輯模式:命令模式(command mode)、輸入模式(input mode)和底行命令模式(last line mode)。

命令模式讓用戶執行豐富的編輯命令;輸入模式讓用戶輸入正文內容;底行命令模式則讓用戶執行打開文件、保存文件、搜索字符串及退出vi等操做命令。進入vi時的默認模式是命令模式。

 

2、不一樣模式間的轉換

(1)命令模式與輸入模式間的切換

在命令模式下,按<a>或<i>鍵,便切換到輸入模式,如圖示3-2所示,圖中屏幕底部(即最後一行)顯示輸入模式的當前狀態。

 

 

圖3-2

 

若要從輸入模式返回到命令模式,則按鍵<Esc>。此時輸入模式的底行輸入狀態的提示消失。

(2)命令模式與底行命令模式間的切換

在命令模式下,按鍵<:>,便切換到了底行命令模式。當進入底行命令時,在屏幕的底部會有提示符「:」出現,如圖示3-3所示。

 

 

圖3-3

 

若要從底行命令模式返回到命令模式,則按鍵<Esc>便可。此時底行的提示符「:」消失。

 

3vi的退出

在底行命令模式的提示符「:」下,鍵入命令 「q!」或「wq」,便退出vi編輯器,返回到shell提示符下。命令「q!」和「wq」的做用以下:

q!:不保存文件的編輯,退出vi,。

wq:保存文件的編輯後,退出vi,

 

3.2 光標移動

在vi中,除了用方向鍵(↑、↓、←、→)、<Home>鍵和<End>鍵,進行上下左右移動、前翻頁和後翻頁外,還能夠在底行命令模式下鍵入命令移動光標。

 

1、光標移至指定行命令

格式:[n]G

功能:將光標移至由n(n表明行號)指定的行的行首,當命令缺省n時,則將光標移至文件最末一行的行首。

例如,若要將光標移到文件首,則鍵入命令「1G」。

例如,若要將光標移到文件尾行,則鍵入命令「G」。

例如,若要將光標移到文件的第三行,則鍵入命令「3G」。

 

2、光標在段落間移動的命令

命令:{

功能:將光標移到上一段的開頭。

 

命令:}

功能:將光標移到下一段的開頭。

3.3 編輯操做

1、輸入

在命令模式下,按鍵<a>或<i>或<o>,切換到輸入模式後,即可插入正文內容,鍵<a>、<i>和<o>的做用以下:

 

<a>:

從當前光標所在位置的下一個字符處開始插入新輸入內容。

<i>:

從當前光標所在位置開始插入新輸入內容。

<o>:

在當前光標所在行下方新增一行,並將光標移到下一行的開始處插入新輸入內容。

 

2、刪除

(1)刪除一個字符

若要刪除文檔中的一個字符,可按鍵<Del>,其做用是刪除當前光標位置的字符。

 

(2)刪除一行

若要刪除文檔中某一行的內容,可先將光標移到該行,而後在命令模式下,按鍵<d><d>(即按兩次d鍵)。

 

3、替換

若要替換修改文檔中的內容,可在命令模式下,按鍵<R>,切換到輸入模式的替換狀態,其做用以下:

 

<R>:

從命令模式切換到輸入模式的替換狀態,新鍵入的正文內容將替換原光標處的文本內容。

 

4、剪切、複製與粘貼

(1)一行正文的複製

若要複製光標所在行,可在命令模式下,按鍵<y><y>,其功能以下:

 

<y><y>:將光標所在行的文本複製到緩衝區。

 

(2)一行正文的剪切

若要剪切光標所在行,可在命令模式下,按鍵<c><c>,其功能以下:

 

<c><c>:將光標所在行的文本剪切到緩衝區。

 

(3)正文塊的設置

若要對正文中某一區域內容進行復制或剪切操做,則可將這一區域內容先標記爲塊,標記的方法以下:

首先,將光標移至塊的首字符下,在命令模式下,按鍵<v>,切換到輸入模式的「VISUAL」狀態;

而後,用方向鍵(↓、→)移動光標到所要設置區域的尾部,塊以高亮度呈現。

 

(4)正文塊的複製

若要複製正文塊內容,在輸入模式的「VISUAL」狀態下,按鍵<y>,其功能以下:

 

<y>:將正文塊內容複製到緩衝區中。

 

(5)正文塊的剪切

若要剪切正文塊,可在輸入模式的「VISUAL」狀態下,按鍵<d>,其功能以下:

 

<d>:將正文塊內容剪切到緩衝區中。

 

(6)粘貼

若要將緩衝區的內容粘貼到指定的位置,可在命令模式下,按鍵<P>或<p>。按鍵<P>和<p>的功能以下:

 

<P>:

將緩衝區中的內容粘貼到當前光標字符位置的前面。

<p>:

將緩衝區中的內容粘貼到當前光標字符位置的後面。

 

5、恢復與撤消

(1)撤消

若要撤消上一次的操做,可在命令模式下,按鍵<u>。按鍵<u>的功能以下:

 

<u>:

撤消上一次的操做。

 

(2)恢復

恢復是指對撤消操做的恢復操做。若要恢復撤消操做,可在命令模式下,按鍵<Ctrl>+<R>,按鍵<Ctrl>+<R>的功能以下:

 

<Ctrl>+<R>:

恢復上一次撤消操做。

 

3.4 查詢操做

1、查找

當須要在正文中搜索指定的字符串,可在底行命令模式的提示符下,鍵入下列搜索命令:

 

命令

功能

/<字符串>:

從當前光標位置向後尋找這個字符串。

?<字符串>:

從當前光標位置往前尋找這個字符串。

n:

重複上一個/或?命令指令,繼續尋找。

N:

重複上一個/或?的指令,反向繼續尋找。

 

2、查找與替換

若在查找字符串的同時,用另外一字符串替換它,這就是查找與替換操做。當須要對正文進行查找與替換操做時,可在底行命令模式下,使用命令查找與替換命令,命令格式以下:

 

[n1,n2]s  /字符串1  /字符串2  [/gc]

 

其功能是在「n1,n2」指定的行範圍中,查找字符串1,找到後,用字符串2替換。

選項說明:

n1,n2:指定從第n1行起到第n2行至的範圍中進行查找和替換,缺省時,只對當前行進行查找與替換操做。

/g:表示對行中全部出現的字符串1均用字符串2替換,缺省時,只在行中出現的全部字符串1,只替換第一個。

/c:表示替換前讓用戶確認。

 

例如,若要對當前文檔中的全部字符串「student」替換成「Student」,且在每個替換前讓用戶確認一下,則鍵入命令「1,n  s/student/Student/gc」(其中,n表示最後一行的行號)。

 

 


【實習報告】

實習報告:Linux vi的使用

學生姓名:       班級:        學號:

 

1、實習內容(完成的內容截圖說明)

一、用vi編輯器創建一個文件exec,文件內容以下:

The present economic system of production,distribution and consumption consumed many years in the making.

 

 

二、在exec文件的第一行後插入以下兩行內容:

when the profits were alloted, I received one-hundred dollars.

Wet days alternated with fien days.

 

 

三、將文件中第二行中的單詞「when」的第一個字符「w」改寫成大寫「W」。

 

 

四、將光標移到單詞「fien」上,修改爲「fine」。

 

 

五、查找到單詞「alloted」,刪除該單詞,從新打入單詞「allotted」。

 

 

六、用「查找」和「替換」命令實現,用「100」替換單詞「one-hundred」。

 

 

七、在文件的第四行上覆制第二行的內容。

 

 

八、將文件中第一行內容移至文件尾。

 

 

九、分別用cat 命令或more命令檢查編輯修改後的exec文件。

 

 

十、將exec文件中的第一行內容寫成文件exec1,存於當前目錄下。

 

 

十一、如何得到有關vi編輯器的幫助信息?

 

 

十二、在exec文件的開始處,插入exec0文件(文件exec0是事先在當前目錄下已建立的文件文件)內容。

 

 

 

2、實習總結

 

 

 


Unit 4  Linux shell編程

【實習要求】

 

掌握Linux shell的基本編程

    包括:編程、調試與應用

 

【實習內容】

 

Linux shell編程

 

【實習指導】

4.1 shell編程簡介

Linux shell是一個命令解釋器,用來接受並執行命令(包括運行批處理文件和執行程序)。shell環繞在內核的外層,它是Linux操做系統和用戶之間的界面。當用戶從shell或其餘程序向Linux傳遞命令,內核會作出相應的反應。

這裏,將介紹Linux下最經常使用的shell —— bash。bash(Bourne Again Shell)是大多數Linux發行套件的缺省shell,並被大多數用戶所使用。

在命令行輸入命令時,每次輸入一個命令,就可獲得系統的響應。但若是常常要依次執行同一組命令,就能夠利用shell程序來實現。shell程序是放在一個文件中的一系列的Linux命令。執行shell程序時,由Linux逐條解釋和執行每一個命令。

 

4.1.1 shell程序文件

shell程序文件是一個特殊的文本文件,其內容包含一系列可在shell提示符下執行的命令,以及shell提供的專用的命令和控制語句。Linux提供的shell命令可經過命令help來得到,在shell提示符下,鍵入命令「help | more」,圖4-1所示是得到全部shell命令的列表的一部分。

 

 

圖4-1

 

如要得到其中命令echo的詳細幫助信息,則在shell提示符下,鍵入命令「help  echo」,便得到該命令的詳細使用信息如圖4-2所示。

 

 

圖4-2

 

圖中可觀察到,該命令的功能是在屏幕上輸出給定的信息。

shell程序文件的運行過程是將shell程序文件中的命令依次執行。

 

4.1.2 shell程序的創建

shell程序文件可用任何一個文件編輯器(如vi)來創建。

 

例如,創建shell程序shex1,存放在當前目錄下(假定當前目錄爲 /root),程序功能爲先清屏,而後顯示98年的一、二、3月份的月曆。程序文件內容以下:

clear

cal  1  98

cal  2  98

cal  3  98

 

用vi編輯器創建shell程序文件shex1的方法以下:

(1)鍵入命令「vi  shex1」,啓動vi;

(2)按命令「i」,進入vi的插入狀態;

(3)輸入程序文件內容;

(4)按<Esc>鍵,再鍵入「:」,切換到vi的命令狀態;

(5)最後鍵入命令「wq」,保存文件內容後,退出vi。

 

至此,shell程序文件shex1已創建。

 

4.1.3 shell程序的運行

運行shell程序有兩種方法:一種是在shell環境下,將shell 程序文件做爲子shell程序被調用執行;另外一種是將shell程序文件視做命令來執行(所以,shell程序文件能夠看做是將各類命令組合在一塊兒而造成的新命令),此時必須賦予shell程序文件執行權限。

 

方法一:sh  <shell程序文件名>  [<參數1>  <參數2>  ……]

 

方法二:<shell程序文件名>  [<參數1>  <參數2>  ……]

 

例如,分別用兩種方法運行已創建的shell程序文件shex1。

方法一:

在shell提示符下,鍵入命令:「sh  shex1」。

 

方法二:

(1) 首先,給shell程序文件shex1賦予可執行權限,則在shell提示符下,鍵入命令:「chmod  a+x  shex1」;

(2)而後,在shell 提示符下,鍵入命令「/root/shex1」即可執行該shex1程序,如同其餘shell命令同樣。

兩種方法的運行結果,如圖4-3所示。

 

 

圖4-3

 

運行命令中有[參數]和沒有[參數]的狀況分別稱爲帶參數的運行命令和不帶參數的運行命令。在shell程序中可以使用的形參爲$0、$一、$二、……$9,當程序運行時,<參數1>  <參數2>  ……依次賦值給$一、$二、……,一般稱運行命令中所帶的參數爲實參。

$0是一個特殊的形參,其值規定爲當前運行的shell程序命令自己。

因爲形參個數有限,當參數較多時,可經過命令shift來移動形參與實參的對應關係,執行一次shift後,$一、$二、……變爲依次與<參數2>  <參數3>……對應,再執行一次shift後,$一、$二、……變爲依次與<參數3>  <參數4>……對應,依此類推。經過下面的例子shell程序shex2,可觀察參數的移動變化。

shex2程序文件內容以下:

echo  $0  $1  $2

shift

echo  $0  $1  $2

運行的命令所帶參數及運行結果如圖4-4所示。

 

 

圖4-4

 

圖中可觀察到,$0的值始終是當前運行的shell程序命令自己,即 /root/shex2。

 

例如,將shex1程序用參數形式進行改寫,程序功能保持不變,最後將程序保存爲shex3,存放在當前目錄下。

shex3程序文件內容以下:

clear

cal  $1  98

cal  $2  98

cal  $3  98

 

運行的命令所帶參數及運行結果分別如圖4-5所示。

 

 

圖4-5

 

當帶參數的運行命令爲「/root/shex3  1 2 3」,則運行結果顯示如圖4-3所示。注意,當實參爲空時,形參將被傳遞空值。

 

4.1.4 shell變量

Linux 的shell程序中容許使用各類類型的變量,主要有系統、內部和用戶變量三種。

系統變量也稱環境變量,它與用戶變量的區別在於它可將值傳給shell運行的其餘命令或shell程序使用,亦即系統變量是全局變量。

內部變量是由系統提供,與環境變量不一樣,用戶不能修改

用戶變量由用戶定義的變量,是當前shell的局部變量,不能被shell運行的其餘命令或shell程序使用,亦即用戶在shell程序中定義的程序變量只在程序運行時有效,一旦退出,這些變量自動失效。

經過shell提供的命令set,能夠查看當前shell下定義的一系列變量及其值。例如,在shell提示符下,鍵入命令「set | more」,顯示當前shell下定義的變量及其值如圖4-6所示。

 

 

圖4-6

 

1、變量賦值

格式:<變量名> =<字符串>

功能:將等號右邊的字符串賦給等號左邊的變量,即右邊的字符串爲左邊變量的值。

說明,任何不含空格的字符串均可做變量名。若字符串中含有空格,則在字符串上加上引號。

 

例如,要求定義一個用戶變量name1,並給變量賦值爲「MARY」,則在shell提示符下,鍵入命令「name1=MARY」。

 

例如,要求定義一個用戶變量 name2並給變量賦值爲「X Window」,則在shell提示符下,鍵入命令「name2="X Window"」。

 

2、引用變量

格式:$<變量名>

功能:引用變量的值。

 

例如,要求將變量name1的值賦給變量name2,則在shell提示符下,鍵入命令「name2=$name1」。

 

例如,要求在屏幕上顯示變量name1的值,則在shell提示符下,鍵入命令「echo  $name1」。

 

3、釋放變量

格式:unset  <變量名>

功能:釋放一個現存的shell變量。

 

例如,要求釋放變量name1,則在shell提示符下,鍵入命令「unset  name1」。變量的定義、賦值及引用過程如圖4-7所示。

 

 

圖4-7

 

4.1.5 shell程序的控制流

與其餘高級語言同樣,shell編程中也提供了條件與循環等控制結構,下面介紹bash提供的主要的程序控制結構語句。

 

1、條件控制流

(1)if-then-else 結構

 

 if  <條件判斷命令>

  then  <命令集1>

  else  <命令集2>

         fi

 

其中,<條件判斷命令>一般是「test  <表達式>」,當條件成立,則返回0;條件不成立,則返回一個非0值。

執行過程說明:當<條件判斷命令>返回0時,則執行then後的<命令集1>,而後執行fi後面的命令;不然執行else 後的<命令集2>,而後執行fi後面的命令。在if-then-else結構中,容許在then和else後的命令集中包含if-then-else結構,即容許嵌套。

須要強調的是其中if和fi必須配對出現。

 

(2)if-then-fi結構

 

 if  <條件判斷命令>

  then  <命令集>

 fi

 

執行過程說明:當<條件判斷命令>返回0時,則執行then後的<命令集>,而後執行fi後面的命令,不然執行fi後面的命令。

 

(3)case結構

 

case  <變量>  in

字符串1)  <命令集1>

        ;;

字符串n)  <命令集n>

       *)  <缺省命令>

esac

 

其中,字符串中可含通配符。

執行過程說明:程序將<變量>的值依次和字符串一、字符串二、……、字符串n進行比較,哪一個匹配,則執行後面的<命令集>;若都不匹配,則執行<缺省命令>。

說明,若是能同時匹配多個字符串,則只能執行第一個匹配字符串後的<命令集>。

 

2、循環控制流

(1)for-in結構

 

for  <循環變量>  [in  <循環變量取值集>]

  do

    <命令集>

          done

 

       其中,<循環變量取值集>中的值與值之間用空格分隔。

執行過程說明:程序從<循環變量取值集>中依次取值,賦給<循環變量>,並執行一輪由do和done括起來的循環體中的<命令集>,直到<循環變量取值集>中的值取完,再執行done後面的命令。

若「in  <循環變量取值集>」缺省,則<循環變量取值集>爲實參集。

 

(2)while 結構

 

 while  <條件判斷命令>

  do

    <命令集>

          done

 

執行過程說明:當<條件判斷命令>返回0時,則執行一輪由do和done括起來的循環體中的<命令集>,直到<條件判斷命令>返回一個非0值時,則再也不執行循環體中的命令,執行done後面的命令。

 

(3)until 結構

 

until  <條件判斷命令>

  do

    <命令集>

          done

 

執行過程說明:與while 結構相反,當<條件判斷命令>返回非0時,執行循環體中的命令,直到<條件判斷命令>返回一個0值時,,繼續執行done後面的命令。

 

3、條件判斷命令test

條件表達式是控制程序流程的關鍵,shell提供的test命令可組合多個表達式,生成功能靈活的條件表達式,使shell程序的功能更強,下面介紹test命令的基本使用。

格式:

test  <表達式>

 

功能:test命令返回表達式成立與否的狀態值,若是表達式成立,則test返回真的狀態值0,不然,test返回假的狀態值,即一個非0值。test命令中的<表達式>常見的有如下幾類:

 

(1)文件特性類

-e  <文件名>:

    檢查<文件名>存在否,若存在,返回真值;不然返回假值。

-f  <文件名>:

    檢查<文件名>是不是普通文件,如果,返回真值;不然返回假值。

-d  <文件名>:

    檢查<文件名>是不是目錄,如果,返回真值;不然返回假值。

-r  <文件名>:

    檢查<文件名>是否可讀,如果,返回真值;不然返回假值。

-w  <文件名>:

    檢查<文件名>是否可寫,如果,返回真值;不然返回假值。

-x  <文件名>:

    檢查<文件名>是否可執行,如果,返回真值;不然返回假值。

-s  <文件名>:

    檢查<文件名>是否存在且文件長度大於零,如果,返回真值;不然返回假值。

<文件名1>  –nt  <文件名2>:

    若是<文件名1>比<文件名2>新(根據文件最後修改時間判斷),返回真值;不然返回假值。

<文件名1>  –ot  <文件名2>:

    若是<文件名1>比<文件名2>舊(根據文件最後修改時間判斷),返回真值;不然返回假值。

<文件名1>  –ef  <文件名2>:

    若是<文件名1>和<文件名2>有相同的設備名和inode號,返回真值;不然返回假值。

 

(2)字符串類

-z  <字符串>:

    若是<字符串>長度爲零,返回真值;不然返回假值。

-n  <字符串>:

    若是<字符串>長度不爲零,返回真值;不然返回假值。

<字符串1>  =  <字符串2>:

    若是<字符串1>與<字符串2>相等,返回真值;不然返回假值。

<字符串1>  !=  <字符串2>:

    若是<字符串1>與<字符串2>不相等,返回真值;不然返回假值。

 

(3)與或表達式類

!<表達式>:

    若是<表達式>爲假,則返回真值;不然返回假值。

<表達式1>  –a  <表達式2>:

    <表達式1>、<表達式2>進行與操做,若<表達式1>、<表達式2>均爲真,則返回真值;不然返回爲假值。

<表達式1>  –o  <表達式2>:

    <表達式1>、<表達式2>進行或操做,若<表達式1>、<表達式2>均爲假,則返回假值;不然返回真值。

 

(4)數值表達式類

<數值表達式1>  –eq  <數值表達式2>:

    若是<數值表達式1>等於<數值表達式2>,則返回真值;不然返回假值。

<數值表達式1>  –ne  <數值表達式2>:

    若是<數值表達式1>不等於<數值表達式2>,則返回真值;不然返回假值。

<數值表達式1>  –lt  <數值表達式2>:

    若是<數值表達式1>小於<數值表達式2>,則返回真值;不然返回假值。

<數值表達式1>  –le  <數值表達式2>:

    若是<數值表達式1>小於或等於<數值表達式2>,則返回真值;不然返回假值。

<數值表達式1>  –gt  <數值表達式2>:

    若是<數值表達式1>大於<數值表達式2>,則返回真值;不然返回假值。

<數值表達式1>  –ge  <數值表達式2>:

    若是<數值表達式1>大於或等於<數值表達式2>,則返回真值;不然返回假值。

 

4.2 shell程序調試簡介

有兩種簡便的跟蹤功能能夠用於shell程序的調試,即在shell程序中加入命令set  -v或set  -x。

 

格式1:set  -v

 

功能:當執行一個shell程序時,會在執行程序文件中的每條命令以前,自動在屏幕上先顯示該條命令。

 

格式2:set  -x

 

功能:當執行shell程序時,它會把將要執行的命令逐條進行參量定值,並以最後執行的形式在屏幕上顯示。

 

4.3 實例

一、編寫shell程序文件shp1,存放在當前目錄下,程序功能要求以下:

若是 /etc目錄中的文件profile存在,則將其複製到fd0盤的根目 錄中,並分屏顯示fd0盤上的profile文件內容;不然在屏幕上顯示信息「profile is not exist!」。

 

(1)用vi創立shell程序文件shp1,程序以下:

 

if  test  -e  /etc/profile

 then  cp  /etc/profile  /mnt/floppy

       cat  /mnt/floppy/profile|more

       rm  -f  /mnt/floppy/profile

 else  echo  profile  is  not  exist!

fi

   

(2)用兩種方法運行程序shp1

方法一:

在shell提示符下,鍵入命令「sh  shp1」。

方法二:

①給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp1」

       ②運行程序

  在shell提示符下,鍵入命令「/root/shp1」

      

觀察運行結果,若文件profile存在,則屏幕顯示如圖4-8所示 ,若文件profile不存在,則屏幕顯示如圖4-9所示。

 

 

圖4-8

 

 

圖4-9

 

二、編寫shell程序文件shp2,存放在當前目錄下,程序功能要求以下:

用for命令實現,在當前目錄下建立名爲user0、user一、user二、……user9十個子目錄後,用長格式顯示這十個目錄的目錄信息,而後用for命令刪去這十個目錄後,再用長格式顯示這十個目錄的目錄信息。

 

(1)用vi創立shell程序文件shp2,程序以下:

 

for  i  in  0 1 2 3 4 5 6 7 8 9

 do  mkdir  user$i

 done

ls  -dl  user?|more

for  i  in  0 1 2 3 4 5 6 7 8 9

 do  rm  -rf  user$i

 done

ls  -dl  user? | more

   

(2)用兩種方法運行程序shp2

方法一:

在shell提示符下,鍵入命令「sh  shp2」。

方法二:

①給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp2」

②運行程序

  在shell提示符下,鍵入命令「/root/shp2」

      

觀察運行結果,屏幕顯示如圖4-10所示。

 

圖4-10

      

三、編寫shell程序文件shp3,存放在當前目錄下,程序功能要求以下:

若是shp3運行時未帶參數,則在屏幕上顯示信息「Parameter  Lost!」,並結束程序運行;若是shp3運行時帶一個參數,則判斷參數所指定的文件是否存在,若是存在則複製該文件到fd0盤的根目錄;不然先在屏幕上顯示信息「File  not  found!」,而後顯示程序自身。

 

(1)用vi創立shell程序文件shp3,程序以下:

 

if  test  -z  $1

 then  echo  Parameter Lost!

 else  if  test  -e  $1

        then  cp  $1  /mnt/floppy

        else  echo  File  not  found!

              cat  $0

       fi

fi

 

(2)用兩種方法運行程序shp3

方法一:

在shell提示符下,鍵入命令「sh  shp3」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp3」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp3」

      

測試並觀察程序運行結果,若鍵入命令「sh  shp3」,則運行結果顯示如圖4-11所示;若鍵入命令「sh  shp3  shp1」,則運行結果顯示如圖4-12所示;若鍵入命令「sh  shp3  sx」(其中,sx參數所指定的文件是一個不存在的文件),則運行結果顯示如圖4-13所示。

 

 

圖 4-11

 

 

圖 4-12

 

 

圖 4-13

 

四、編寫shell程序文件shp4,存放在當前目錄下,程序功能要求以下:

若是shp4運行時未帶參數,則在屏幕上顯示信息「ERROR1」;若是shp4運行時只帶一個參數,則在屏幕上顯示信息「ERROR2」;若是帶兩個不一樣的參數且參數1所指定的文件存在,則將參數1所指定的文件複製到fd0盤的根目錄中,並更名爲參數2所指定的文件名。

 

(1)用vi創立shell程序文件shp4,程序以下:

 

if  test  -z  $1

  then  echo  ERROR1

  else  if  test  -z  $2

         then  echo  ERROR2

         else  if  test  $1  !=  $2  -a  -e  $1

                then  cp  $1  /mnt/floppy/$2

               fi

        fi

fi

 

(2)用兩種方法運行程序shp4

方法一:

在shell提示符下,鍵入命令「sh  shp4」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp4」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp4」

 

測試程序,若鍵入命令「sh  shp4  shp1  test1」、「cat  shp1」、「cat  /mnt/floppy/test1」,則運行結果顯示如圖4-14所示。

 

圖4-14

 

圖中可觀察到,fd0盤上的複製文件的內容te

sst1與原文件shp1的內容徹底一致。

 

五、編寫shell程序文件shp5,存放在當前目錄下,程序功能要求以下:

① 清屏

② 當程序運行時,屏幕顯示以下形式的信息:

*********************************************************************

* This  is  a  shell  program  for  renaming  and  ...*

*********************************************************************

③ 檢查在fd0盤的根目錄中,是否存在由參數1指定的文件,若不存在,則屏幕顯示信息「File  not  found!」;若存在則將參數1指定的文件更名爲由參數2指定的文件名,而後用for命令對更名後的文件顯示長格式的目錄信息和文件內容。

 

(1)用vi創立shell程序文件shp5,程序以下:

 

clear

echo  "***********************************************"

echo  "* This is a shell program for nameing ... *"

echo  "***********************************************"

if  test  -n  $1  -a  -n  $2

 then  if  test  $1  !=  $2

        then  if  test  -e  $1

               then  mv  $1  $2

                     for  cn  in  "ls -l"  "cat" 

                      do

                       $cn  $2

                       echo " "

                      done

              fi

        else  echo  File  not  found!

       fi

fi

 

(2)用兩種方法運行程序shp5

方法一:

在shell提示符下,鍵入命令「sh  shp5」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp5」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp5」

      

測試程序,若鍵入命令「/root/shp5  shp1  abc」,觀察到的運行結果如圖4-15所示。

 

圖4-15

 

六、編寫shell程序文件shp6,存放在當前目錄下,程序功能要求以下:

運行程序shp6時帶一個正整數參數,將參數值存入變量value中,若是該參數大於等於1但小於3,則在屏幕上顯示信息「Value is less than 3 and not less than 1.」;若是該參數大於等於3,則在屏幕上顯示信息「Value is not less than 3.」;最後以「value=xx」的形式顯示變量value的值。

 

(1)用vi創立shell程序文件shp5,程序以下:

 

if  test  $1  -ge  1  -a  $1  -lt  3

 then  value=$1

       echo  value  is  less  than  3  and  not  less  than 1

fi

if  test  $1  -ge  3

 then  value=$1

       echo  value  is  not  less  than  3

fi

echo  value=$value

 

(2)用兩種方法運行程序shp6

方法一:

在shell提示符下,鍵入命令「sh  shp6」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp6」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp6」

 

測試程序並觀察運行結果如圖4-16所示。

 

 

圖4-16

 

七、編寫shell程序文件shp7,存放在當前目錄下,程序功能要求以下:

若是shell程序文件的文件名不爲test0,而且當前目錄中不存在test0文件,則將本shell程序文件的名字改成test0,若當前目錄中存在test0文件,則先刪除,再將本shell程序文件的名字改成test0。

 

(1)用vi創立shell程序文件shp7,程序以下:

 

echo  Filename  must  be  test0.

if  test  $0  !=  test0

 then

  if  test  -e  test0

    then  rm  -f  test0

  fi

  mv  $0  test0

fi

 

(2)用兩種方法運行程序shp7

方法一:

在shell提示符下,鍵入命令「sh  shp7」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp7」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp7」

 

測試程序並觀察運行結果顯示如圖4-17所示。

 

圖4-17

 

八、編寫shell程序文件shp8,存放在當前目錄下,程序功能要求以下:

判斷fd0盤的根目錄下是否存在子目錄dir1和dir2,若不存在,則先創建它們;若存在,則分別刪除目錄下的文件dlist和flist。而後將/home目錄下全部目錄文件的目錄信息,以長格式形式保存到fd0盤的dir1子目錄下的文件dlist中;將/home目錄下的全部文件的目錄信息,以長格式形式保存到fd0盤的dir2子目錄下的文件flist中。

 

(1)用vi創立shell程序文件shp8,程序以下:

 

if  test  !  -d  /mnt/floppy/dir1

 then  mkdir  /mnt/floppy/dir1

 else  rm  -f  /mnt/floppy/dlist

fi

if  test  !  -d  /mnt/floppy/dir2

 then  mkdir  /mnt/floppy/dir2

 else  rm  -f  /mnt/floppy/flist

fi

ls  -dl  /home  > /mnt/floppy/dir1/dlist

ls  -l  /home  > /mnt/floppy/dir2/flist

 

(2)用兩種方法運行程序shp8

方法一:

在shell提示符下,鍵入命令「sh  shp8」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp8」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp8」

 

測試程序並觀察運行結果顯示如圖4-18所示。

 

圖4-18

 

九、編寫shell程序文件shp9和sub1,存放在當前目錄下,程序完成如下功能:

shp9做爲shell程序文件的主文件,sub1做爲shell程序文件的子文件,當shp9調用sub1時傳遞兩個參數,參數1爲文件權限屬性,參數2爲指定用戶,sub1的功能是將當前目錄下以小寫字母開頭且文件名長度爲2的全部文件,爲指定用戶設置指定的權限屬性。

 

(1)用vi創立shell程序文件shp9和sub1,shp9程序以下:

 

sh  sub1  r  u

sh  sub1  w  g

sh  sub1  x  o

ls  -l  [a-z]?

 

鍵入sub1程序以下:

chmod  $2=$1  [a-z]?

 

(2)用兩種方法運行程序shp9

方法一:

在shell提示符下,鍵入命令「sh  shp9」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp9」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp9」

 

測試並觀察程序運行結果顯示如圖4-19所示。

 

圖4-19

 

十、編制一個shell程序文件shp10,當以命令「shp10  xx  yy」執行shell程序時(其中,xx爲年份參數,yy爲季度參數),能自動清屏,並顯示指定年份指定季度中的三個月的月曆。

 

(1)用vi編輯器編輯創建shell程序文件shp10,程序以下:

 

clear

k=$2

if  test  $k=1

  then  cal  1  $1

        cal  2  $1

        cal  3  $1

fi

if  test  $k=2

  then  cal  4  $1

        cal  5  $1

        cal  6  $1

fi

if  test  $k=3

  then  cal  7  $1

        cal  8  $1

        cal  9  $1

fi

if  test  $k=4

  then  cal  10  $1

        cal  11  $1

        cal  12  $1

fi

 

(2)用兩種方法運行程序shp10

方法一:

在shell提示符下,鍵入命令「sh  shp10」。

方法二:

① 給程序文件賦予可執行屬性「X」

  在shell提示符下,鍵入命令「chmod  a+x  shp10」

② 運行程序

  在shell提示符下,鍵入命令「/root/shp10」

 

測試並觀察程序的運行結果如圖4-20所示。

 

圖4-20

 

十一、編制一個shell程序shp11,當用命令「shp11  xx  yy  ...」執行程序 shp11時(其中,xx yy …爲一系列指定文件的參數),要求能判斷由參數指定的每一個文件是否存在,若不存在,則在屏幕上顯示信息「file not exists」;若是文件存在,則進一步判斷文件長度是否爲零,若文件長度爲零,則屏幕顯示信息「file exists and has a size equal zero」,不然顯示信息「file exists and has a size greater then zero」。

 

(1)用vi編輯器創建shell程序文件shp11,用while循環結構編制shp11程序以下:

 

while  test  $1

 do

  If  test  -e  $1

    then  if  test  -s  $1

           then  echo  file $1 exists and has a size greater than zero.

           else  echo  file $1 exists and has a size equal zero.

          fi

    else  echo  file $1  not  exists.

  fi

  shift

 done

 

用until循環結構編制shp11程序以下:

 

until  test  -z  $1

 do

  if  test  -e  $1

    then  if  test  -s  $1

           then  echo  file $1  exists and has a size greater than zero.

           else  echo  file $1  exists and has a size equal zero.

          fi

    else  echo  file $1  not exists.

  fi

  shift

 done

 

(2)創建一個長度爲零的文件f1,用命令「sh  shp11  f1」執行程序shp11,測試程序的正確性,屏幕顯示如圖4-21所示。

 

圖4-21

 


【實習報告】

實習報告:Linux shell編程

學生姓名:       班級:        學號:

1、完成shp11-shp11練習並完成如下內容

 

 

 

 

 

2、實習內容

一、編寫shell程序文件sht1,存放在當前目錄下,程序功能要求以下:

(1)清屏

(2)當程序運行時,屏幕顯示以下形式的信息:

    ****************************

       *  Hello  World!  ...*

    ****************************

 

 

 

二、編寫shell程序文件sht2,存放在當前目錄下,程序功能要求以下:

用for命令結構實現,檢查當前目錄下文件f一、f二、f三、f四、f5,若長度爲零則刪除它(刪除時,不須要用戶確認)。

 

 

 

三、編寫shell程序文件sht3,存放在當前目錄下,程序功能要求以下:

(1)檢查fd0盤根目錄下,是否存在文件fd0tree,存在則刪除它;

(2)用一條命令,在fd0盤根目錄下創建名爲temp0、temp一、……、tmep9的十個子目錄;

(3)以fd0盤根目錄爲起點的目錄樹圖形結構組成一個可觀察文件fd0tree,存放到fd0盤的根目錄中;

(4)用一條命令,將fd0盤根目錄下的temp0、temp一、……、temp9十個子目錄刪除;

(5)將以fd0盤根目錄爲起點的目錄樹圖形結構,添加到fd0盤根目錄下文件fd0tree的尾部。

 

 

 

四、編寫shell程序文件sht4,存放在當前目錄下,程序功能要求以下:

運行程序sht4時帶一個正整數參數,若是該正整數大於等於1但小於等於5,則在屏幕上顯示信息「Value is not more than 5 and not less than 1.」;若是該參數大於5,則在屏幕上顯示信息「Value is more than 5.」。

 

 

 

五、編寫shell程序文件sht5和sub2,存放在當前目錄下,完成以下功能:

sht5做爲shell程序文件的主文件,sub2做爲shell程序文件的子文件,由sht5調用sub2完成自動在fd0盤根目錄下創建USER00、USER0一、……、USER99一百個子目錄。

 

 

 

六、將上機實踐中的shell程序文件shp10用case結構進行改寫爲shell程序文件sht6,程序功能不變。

 

 

 

 

 

3、實習總結

 

 

 

 

 


Unit5  Linux C編程

【實習要求】

 

一、掌握Linux C的基本編程與調試

     包括:編程與調試

二、掌握Linux C程序與OS的傳遞參數

 

【實習內容】

 

Linux C編程

 

【實習指導】

5.1 程序的編輯與編譯

1、源程序的編輯

Linux中,C源程序可以使用Linux的編輯器vi,或Emacs進行編寫。

 

2、源程序的編譯

在Linux中,gcc(GNU C Compiler)是C、C++、ObjectiveC源程序的編譯器,gcc編譯C源程序並生成可執行文件要通過如下四步:

(1)預處理

gcc編譯器調用cpp程序,對各類命令如 #define、#include、#if 進行分析。

(2)編譯

gcc編譯器調用ccl程序,根據輸入文件產生中間文件。

(3)彙編

gcc編譯器調用as程序,用中間文件做爲輸入產生以o做爲類型名的目標文件。

(4)鏈接

gcc編譯器調用 ld程序,將各目標程序組合於可執行文件中的適當位置,這一程序引用的函數也放在可執行文件中。

gcc編譯器的命令格式以下:

 

gcc  [options] [filename]…

 

經常使用選項的說明:

-c:對源程序進行預處理、編譯,產生目標文件,但不進行鏈接。

-o  <文件名>:定義輸出的執行文件名爲<文件名>。

-S:在編譯後中止,產生類型名爲s的彙編代碼文件,不生成中間文件。

-E:在預處理後中止,輸出預處理後的源代碼至標準輸出,不進行編譯。

-O:對程序編譯進行優化,減小被編譯程序的長度和執行時間,但此時的編譯速度比不做優化慢且要求較多的內存。

-g:產生一張用於調試和排錯的擴展符號表,此選項使程序可用gdb進行調試。

-lobjc:可用於鏈接類型名爲o的目標文件生成可執行文件。 

 

3、程序的運行

經調試排錯後的目標程序便可正常運行,併產生應有的正確結果。運行目標程序的方法是在shell提示符下,鍵入目標程序的絕對路徑和目標程序名。

 

5.2 程序的調試

5.2.1 gdb簡介

當編譯後獲得的目標程序在運行時出現故障,或運行的結果與咱們的預期不一致,咱們一般稱程序發生了運行錯誤,或邏輯錯誤。這時,須要對源程序進行調試以找出錯誤,排除故障。Linux提供了調試源程序的工具gdb(GNU debugger),gdb不只容許用戶在運行程序時顯示源代碼,並且在調試過程當中容許在預設的斷點處暫停程序的運行,顯示變量的內容。下面介紹 gdb的基本使用方法。

 

1gdb的啓動與退出

在shell提示符下,鍵入命令 「gdb  <文件名>」,則啓動gdb並運行由<文件名>指定的目標程序文件,並給出gdb的提示符:(gdb)。

在gdb的提示符下,鍵入命令「q」(或quit),退出gdb。

       啓動和退出gdb的過程如圖5-1所示。

 

圖5-1

 

2gdb中的經常使用命令如表5-1所示。

 

5-1  gdb中的經常使用命令

命令

功能

r(或run)

運行程序。

p  <變量>(或print <變量>)

顯示變量內容。

p  &<變量>(或print &<變量>)

顯示變量地址。

set  <變量>=<值>

對變量賦值。

where

顯示函數的調用狀況及使用的參數。

info  locals

顯示已定義的變量和參數。

l  <行號>(或list  <行號>)

顯示指定行號開始的源代碼。

l  <函數>(或list  <函數>)

顯示函數中的源代碼。

l  <數字>,<數字>

(或list  <數字>  <數字>)

顯示指定行號範圍內的源代碼。

n和s(或next和step)

單步執行程序。

c(或cont)

繼續執行程序。

b(或break)

在當前行設置斷點。

b  <行號>(或break  <行號>)

在指定的行設置斷點。

b  <函數>(或break  <函數>)

在指定函數的第一行設置斷點。

info  break

列出全部的斷點。

d(或delete)

刪除全部斷點。

d  <數字>

刪除指定斷點號的斷點。

 

注意:在使用gdb調試程序前,必須使用gcc - g對源程序進行編譯。

 

5.2.2 調試實例

1、創建C源程序文件star.c,程序內容以下:

main()

{

  int i=0;

  do{

     printf("*");

     ++i;

 }while(i<10);

     printf("\n");

   }

 

用vi編輯器創建c源程序文件star.c的方法以下:

(1)鍵入命令「vi  star.c」,啓動vi;

(2)按命令「i」,進入vi的插入狀態;

(3)輸入程序內容;

(4)按<Esc>鍵,再鍵入「:」,切換到vi的命令狀態;

(5)最後鍵入命令「wq」,保存文件內容後,退出vi。

至此,c源程序文件star.c已創建。

 

2、編譯程序star.c,其目標程序以star命名且可用gdb進行調試

調試方法以下:

(1)對源程序進行編譯,在Shell提示符下,鍵入命令「gcc  -g  star.c  -o  star」,屏幕提示如圖5-2所示。

 

 

圖5-2

 

(2)若是出現shell提示符,說明編譯成功,此時可用ls命令查看當前目錄,可看到目標程序文件star。如圖5-3所示。

 

 

圖5-3

 

3、使用gdb調試工具監視程序執行

跟蹤調試的方法以下:

(1)啓動gdb並運行程序star。在shell提示符下,鍵入命令「gdb star」,出現gdb的提示符(gdb)如圖5-4所示。

 

 

圖5-4

 

(2)在(gdb)提示符下。鍵入命令「l  1,7」,屏幕輸出star源程序,如圖5-5所示。

 

 

圖5-5

 

(3)將斷點設在源程序的第5行。在(gdb)提示符下,鍵入命令「b 5」,如圖5-6所示。

 

 

 

圖5-6

 

(4)程序在斷點處暫停運行。在(gdb)提示符下,鍵入命令「r」, 屏幕提示如圖5-7所示:

 

圖5-7

 

(5)在(gdb)提示符下,鍵入命令「p  i」 ,屏幕上顯示變量i的值,如圖5-8所示。

 

 

圖5-8

 

(6)在(gdb)提示符下,鍵入命令「c」,程序從斷點處繼續運行至下一斷點,重複(5)~(6)的操做至變量i的值爲3。如圖5-9所示。

 

 

圖5-9

 

(7)在(gdb)提示符下,鍵入命令「info break」,屏幕顯示出全部設置的斷點,如圖5-10所示。

 

 

圖5-10

 

(8)在(gdb)提示符下,鍵入命令「d」,屏幕提示如圖5-11所示。

 

圖5-11

 

(9)在(gdb)提示符下,鍵入命令「info break」,屏幕提示沒有斷點,如圖5-12所示。

 

 

圖5-12

 

(10)在(gdb)提示符下,鍵入命令「c」 ,程序一直運行到結束,屏幕上輸出程序的運行結果,如圖5-13所示。

 

 

圖5-13

 

(11)在(gdb)提示符下,鍵入命令「q」,退出gdb。

 

5.3 程序與OS間的參數傳遞

一般狀況下,主函數main不帶任何參數,形式爲main()。帶參數的main函數的原型以下:

 

main(int argc, char * argv[]);

 

main函數是由操做系統調用的,所以當須要在系統與程序間傳遞信息時,可經過這二個形參來完成。操做系統命令行的通常形式爲:

 

命令名  參數參數參數3 ……參數n

 

從命令行,咱們能夠看出是由一組字符串組成,所以main函數的形參指針數組argv中的元素argv[0]指向字符串「命令名」,argv[1]指向字符串「參數1」,……,形參argc是命令行中參數的個數。

 

示例:執行命令「file  shanghai  sspu」(其中file爲可執行程序),顯示參數的個數與各參數。

 

#include <stdio.h>

 

main(int argc, char * argv[])

{

  printf("counts=%d\n",argc);

  whiel (argc>1)

  {

    ++argv;

    printf("%s\n",*argv);

    --argc;

  }

}

 

命令執行結果,在屏幕上輸出以下:

counts=3

shanghai

sspu


【實習報告】

實習報告:Linux C編程

學生姓名:       班級:        學號:

 

1、實習內容

一、創建C源程序p1.c,程序內容以下:

 

二、用gcc編譯器編譯該程序,其目標程序以p1命名且可用gdb進行調試。

三、試運行該程序,用gdb對該程序進行調試,直至產生下圖所示的執行結果。

 

 

 

四、編寫程序p2,當執行命令「p2  file1  file2」,實現複製文件file1成file2。

 

2、實習總結

 

 

 


Unit6  Linux設備編程

【實習要求】

 

一、掌握Linux揚聲器設備編程

二、掌握Linux揚聲器設備編程的應用――揚聲器唱歌

三、掌握軟盤、U盤的使用

 

【實習內容】

 

一、Linux揚聲器設備編程

二、Linux揚聲器設備編程的應用

三、軟盤、U盤的使用

 

【實習指導】

6.1 Linux聲音設備編程

完成《操做系統原理實驗》中「6.4 Linux聲音設備編程」實驗內容(P160-166)

6.2 Linux揚聲器編程的應用

利用揚聲器發聲的頻率,讓揚聲器唱歌。

1、音調的製做簡介

中央C的頻率爲523.3,D爲587.3,E爲659.3,F爲698.5,G爲784.0 …… ,綜合如表所示:

6-1 音階-頻率對照表

音階

頻率

音階

頻率

音階

頻率

C0

262

C

523

C1

1047

C0#

277

C#

554

C1#

1109

D0

294

D

587

D1

1175

D0#

311

D#

622

D1#

1245

E0

330

E

659

E1

1319

F0

349

F

698

F1

1397

F0#

370

F#

740

F1#

1480

G0

392

G

784

G1

1568

G0#

415

G#

831

G1#

1661

A0

440

A

880

A1

1760

A0#

466

A#

932

A1#

1865

B0

497

B

988

B1

1976

 

2、實例揚聲器唱歌

 

1)小蜜蜂歌譜

| 5 33 | 4 22 | 12 34 | 55 5 |

| 5 33 | 4 22 | 13 55 | 1- |

| 11 11 | 1 23 | 33 33 | 34 5 |

| 5 33 | 4 22 | 13 55 | 1 -|

 

說明:

① 半音的音長爲250毫秒。

② 全音的音長爲500毫秒。

③ 二拍的音長爲1000毫秒。

 

2)程序代碼

#include < fcntl.h >

#include < stdio.h >

#include < stdlib.h >

#include < string.h >

#include < unistd.h >

#include < sys/ioctl.h >

#include < sys/types.h >

#include < linux/kd.h >

 

int main(int argc, char **argv)

{

   int console_fd;  //揚聲器設備文件句柄

   int i;           // 循環變量

   int s[ ] = {784,659,659,698,587,587,523,587,659,698,784,784,787};

      //第一句樂句的音階的頻率

   int len[ ] = {500,250,250,500,250,250,250,250,250,250,250,250,500};

      //每個音階的發聲長度

 

       // 打開控制檯,失敗則結束程序

       if ( ( console_fd = open ( "/dev/console", O_WRONLY ) ) == -1 )

       {

         fprintf(stderr, "Failed to open console.\n");

         perror("open");

         exit(1);

       }

    

      //揚聲器開始唱歌

      for (i = 0; i < 13; i++)

      {

        int magical_fairy_number = 1190000/s[i];

        ioctl(console_fd, KIOCSOUND, magical_fairy_number); //發聲一個音階

        usleep(1000 * len[i]);                       //延長響聲,即節拍長度

        ioctl(console_fd, KIOCSOUND, 0);   //一個音階的節拍唱完,中止發聲

        usleep(1000 * 50);              // 每一個音階之間的停頓,即不發聲延遲

       }//for i 唱下一個音階

  }//main()

 

 

6.4 U盤使用

一、先別插U盤,/sbin/lsmod看是否有usb-storage,若是沒有的話,依次執行以下命令:

cd  /lib/modules/2.4.20-8/kernel/drivers/usb

for  v  in  *.o  storage/*.o ;  do  /sbin/insmod  $v ;  done

 

二、再執行命令:/sbin/lsmod,應該有usbcore、usb-ohci(或usb-uhci,根據主板芯片組而不一樣)、usb-storage、scsi_mod等。其中usb-storage的狀態應該爲(unused)。

 

三、插入U盤,不停的/sbin/lsmod,這期間usb-storage的狀態應爲Initializing,持續片刻。

 

四、初始化結束後,/sbin/fdisk -l,應該能看到/dev/sda1設備。這時,執行命令:

 

mount  /dev/sda1  /mnt/udisk

 

若是是MSDOS格式,又想看到中文,可使用命令:

 

mount -t vfat /dev/sda1 /mnt/udisk -o iocharset=gb2312。

 


【實習報告】

實習報告:Linux設備編程

學生姓名:       班級:        學號:

 

1、實習內容

一、Linux揚聲器設備編程

      # include <fcntl.h>

      # include <stdio.h>

      # include <stdlib.h>

      # include <string.h>

      # include <unistd.h>

      # include <sys/ioctl.h>

      # include <sys/types.h>

      # include <linux/kd.h>

 

      // 設定默認值

 

      # define DEFAULT_FREQ 440             // 設定一個合適的頻率

      # define DEFAULT_LENGTH 200          // 200微秒,發聲的長度以微秒爲單位

      # define DEFAULT_REPS 1               // 默認不重複發聲

      # define DEFAULT_DELAY 100            // 一樣以微秒爲單位

 

 

 

      // 定義一個結構,存儲所需的數據

 

      typedef struct

 

      {

    int freq;                                 // 指望輸出的頻率,單位爲Hz

         int length;                               // 發聲長度,以微秒爲單位

         int reps;                                 // 重複的次數

         int delay;                                // 兩次發聲間隔,以微秒爲單位

 

} beep_parms_t;

 

 

 

// 打印幫助信息並退出

 

void usage_bail(const char *executable_name)

 

{

 

  printf("Usage: \n \t%s [-f frequency] [-l length] [-r reps] [-d delay] \n ",executable_name) ;

  exit(1) ;

 

}

 

// 分析運行參數,各項意義以下:

// "-f <以Hz爲單位的頻率值>"

// "-l <以毫秒爲單位的發聲時長>"

// "-r <重複次數>"

// "-d <以毫秒爲單位的間歇時長>"

 

 void parse_command_line(char **argv, beep_parms_t *result)

      {

 

          char *arg0 = *(argv++) ;

          while (*argv)

       {

          if (!strcmp(*argv, "-f" ) )

           {                                                                                                    // 頻率

 

                  int freq = atoi(*( ++argv) ) ;

                  if ( (freq <= 0) || (freq > 10000) )

                    {

                      fprintf(stderr, "Bad parameter: frequency must be from l..10000\n" ) ;

                      exit(1) ;

                     }

                   else

  {

                      result -> freq = freq;

                      argv++;

                      }

                   } else

                     if (!strcmp(*argv, "-l") )

                      {                                     // 發聲的時間長度

                          int length = atoi( *(++argv) ) ;

                          if (length < 0)

 

                          {

                             fprintf(stderr, "Bad parameter: length must be >= 0\n" ) ;

                             exit(1) ;

                      } else  

                           {

                          result -> length = length;

                          argv++;

                           }

 

                  } else

                      if (!strcmp(*argv, "-r" ) )

                                        {                                        // 重複次數

 

                          int reps = atoi( * (++argv) ) ;

                          if (reps < 0)

                          {

                              fprintf(stderr, "Bad parameter:reps must be >= 0\n" ) ;

                              exit(1) ;

                          } else

                          {

                              result -> reps = reps;

                              argv++;

                          }

                      } else

                          if (!strcmp(*argv, "-d") )

                                            {                                           // 延時

                              int delay = atoi( * (++argv) ) ;

                              if (delay < 0)

                              {

 

                                fprintf(stderr, "Bad parameter: delay must be >= 0\n" ) ;

                                 exit(1) ;

                              } else

                              {

                                  result -> delay = delay;

                                  argv++;

                                }

 

                              } else

                              {

 

                               fprintf(stderr, "Bad parameter:%s\n" , *argv) ;

                               usage_bail(arg0) ;

                                }

 

                   }

 

          }

 

 

 

          int main(int argc, char **argv)

          {

          int console_fd;

          int i;                                                    // 循環計數器

 

          // 設發聲參數爲默認值

         beep_parms_t  parms={DEFAULT_FREQ, DEFAULT_LENGTH,

              DEFAULT_REPS, DEFAULT_DELAY} ;

 

          // 分析參數,可能的話更新發聲參數

         parse_command_line(argv, &parms) ;

 

          // 打開控制檯,失敗則結束程序

 

          if ( (console_fd = open("/dev/console" , O_WRONLY) )== -1)

          {

 

               fprintf(stderr, "Failed to open console. \n") ;

               perror("open") ;

               exit(1) ;

          }

 

          // 真正開始讓揚聲器發聲

for (i = 0; i < parms.reps; i++)

{

               // 數字1190000從何而來,不得而知

int magical_fairy_number = 1190000/parms.freq;

               ioctl(console_fd, KIOCSOUND, magical_fairy_number);  // 開始發聲

               usleep(1000*parms.length);                           // 等待…

               ioctl(console_fd, KIOCSOUND, 0);                     // 中止發聲

              usleep(1000*parms.delay);                            // 等待…

           }                                                      // 重複播放

 

              return EXIT_SUCCESS;

 

      }

 

 

 

二、Linux揚聲器設備編程的應用

調試上面6.2 Linux揚聲器編程的應用程序,實現揚聲器唱歌。

 

 

三、U盤的使用

 

 

 

2、實習總結

 

 

 


Unit7  Linux併發程序設計

【實習要求】

 

一、掌握Linux進程控制

    包括:建立、運行、終止與同步

二、掌握Linux進程通訊

    包括:管道的概念、模型與基本使用

三、掌握Linux命令接口管理進程的基本使用

    包括:ps、kill等

四、掌握Linux命令接口的重定向與管道的基本使用

    包括:重定向、管道等

 

【實習內容】

 

一、Linux進程控制

二、Linux進程通訊

三、Linux命令接口管理進程

四、Linux命令接口的重定向與管道

 

7.1 Linux進程控制

在Linux中,進程是正在執行的程序。一個進程又能夠開啓另外一個進程,被開啓進程爲子進程,開啓者爲父進程。所以Linux的進程環境提供了一個像文件系統目錄樹那樣的層次結構。進程樹的頂端是一個名爲init的控制進程,該進程是全部用戶進程的祖先。

Linux系統向程序員提供了一組進程控制方面的系統調用,其中最重要的有如下幾個:

fork()系統調用,經過複製調用進程來創建新的進程,是最基本的進程創建操做。

exec系列系統調用,每一個系統調用都完成相同的功能,即經過用一個新的程序覆蓋調用者的內存空間,實現進程的轉變。各類exec系統調用之間的區別僅在於它們的參數構造不一樣。

wait()系統調用,提供了初級的進程同步措施,能使一個進程等待,直到另外一個進程結束爲止。

exit()系統調用,終止一個進程的運行。

7.1.1 進程的建立

1、系統調用fork()

fork()的做用是建立一個新進程,它是調用進程的一個拷貝,除了它有本身的內存拷貝、本身的進程ID(具備與其餘進程的正確關係)和本身的指向共享內核實體如文件描述符的指針。

在調用fork()以後,兩個進程,父進程和子進程,將在它們各自的地址空間執行fork()的下一條語句。若是調用成功,那麼在父進程中fork()返回新建立的子進程的進程ID,而在子進程中fork()返回零值。

原型:pid_t  fork();

說明:fork()在系統庫unistd.h中聲明,pid_t在系統庫sys/types.h中聲明。

 

示例:使用系統調用fork(),建立新進程。

#include <stdio.h>

#include <unistd.h>  

#include <sys/types.h>

main()

{

  pid_t pid;

  printf(「Now only one process\n」);

  printf(「Calling fork ...\n」);

  pid=fork();

  if (!pid)

    printf(「I’m the child\n」);

  else

    if (pid>0)

      printf(「I’m the parent,child has pid %d\n」,pid);

    else

      printf(「Fork fail!\n」);

}

 

2、系統調用getpid()

getpid()的做用是得到進程自己的進程標識符。

原型:pid_t getpid();

說明:getpid()在系統庫unistd.h中聲明。

 

示例:使用系統調用getpid(),得到進程標識符。

#include <stdio.h>

#include <unistd.h>

int main()

{

  printf("The current process ID is %d\n",getpid());  //輸出本進程的ID

  return 0;

}

 

3、系統調用getppid()

getppid()的做用是得到當前進程的父進程標識符。

原型:pid_t getppid();

說明:getppid()在系統庫unistd.h中聲明。

 

示例:fork()建立子進程後,子進程在屏幕上顯示子進程標識符與父進程標識符。

#include <stdio.h>

#include <unistd.h>  

 

main()

{

  pid_t  pid;

  printf(「Now only one process,PID is %d\n」);

  printf(「Calling fork ...\n」);

  pid=fork(); 

  if (!pid)

    printf("This is child process\n");

    printf("My PID(child) is %d\n",getpid());

    printf("My parent PID is %d\n",getppid());

  else

    if (pid>0)

      printf("This is parent process\n");

    else

      printf(「Fork fail!\n」);

}

7.1.2 進程的運行

fork()只能創建相同程序的副本。exec系列的系統調用,能夠用於新程序的運行。exec系列中的系統調用都完成相同的功能,它們把一個新程序裝入調用進程的內存空間,來改變調用進程的執行代碼,從而造成新進程。若是exec調用成功,調用進程將被覆蓋,而後重新程序的入口開始執行,這樣就產生了一個新的進程,可是它的進程標識符與調用進程相同。

這就是說,exec沒有創建一個與調用進程併發的新進程,而是用新進程取代了原來的進程。因此,在exec調用成功後,沒有任何數據返回,這與fork()不一樣。

下面給出exec系列系統調用在Linux系統庫中unistd.h中的函數聲明:

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *agr, ...);

int execle(const char *path, const char *arg, ..., char * const envp[]);

int execv(const char *path, char * const argv[]);

int execvp(const char * file, char * const argv[]);

int execve(const char *path, char * const argv[], ..., char * const envp[]);

 

在這裏咱們着重討論exec系列中的一個系統調用,即execl(),其他請讀者經過Linux系統提供的man手冊查閱並實驗。

execl()調用的參數均爲字符型指針,第一個參數path給出了被執行程序文件所在的有效路徑名;第二個以及用省略號表示的其餘參數一塊兒組成了該程序執行時的參數表。參數表的第一項是不帶路徑的程序文件名,被調用的程序能夠訪問這個參數表,因爲參數的個數是任意的,因此必須用一個NULL指針來標記參數表的結尾。注意,程序文件必須是一個真正的可執行程序,另外不能用execl()來運行一個shell命令組成的文件。

 

示例:使用execl()系統調用,運行目錄列表程序ls

 

#include <stdio.h>

#include <unistd.h>

 

void main()

{

 

  printf("Executing is \n");

  execl("/bin/ls","ls","-l",NULL);

 

  perror("execl failed to run is");  //若是execl返回,說明調用失敗

  exit(1);

}

 

示例:上述功能改用execv()系統調用完成。

 

#include <stdio.h>

#include <unistd.h>

 

void main()

{

  char * av[]={"ls","-l",NULL};

 

  printf("Executing is \n");

  execv("/bin/ls",av);

 

  perror("execv failed");

  exit(1);

}

 

示例:使用系統調用fork()exec,使父子進程運行徹底不一樣的程序。

 

#include <stdio.h>

#include <unistd.h>

 

void main()

{

  int pid;

 

  pid = fork();

  switch (pid)

  {

    case -1:

      perror("fork failed");

      exit(1);

    case 0:

      execl("/bin/ls","ls","-l",NULL);

      perror("execl failed");

      exit(1);

    default:

      wait(NULL);

      printf("is completed\n");

      exit(0);

  }//switch (pid)

}

7.1.3 進程的終止

系統調用exit()

exit()的做用是實現進程的終止。

原型:void exit(int status);

說明:exit()在系統庫stdlib.h中聲明。

 

參數status稱爲進程的退出狀態,父進程可使用它的低8位。exit()的返回值一般用於指出進程所完成任務的成敗。若是成功,則返回0;若是出錯,則返回非0值。

exit除了中止進程的運行外,還有一些其餘的做用,其中最重要的是,它能夠關閉全部已打開的文件。若是父進程因執行了wait調用而處於睡眠狀態,那麼子進程執行exit會從新啓動父進程運行。另外,exit還將完成一些系統內部的清除工做,例如緩衝區的清除等。

除了使用exit來終止進程外,當進程運行完程序到達main函數末時,進程會自動終止。當進程在main函數內執行return語句時,它也會終止。

在Linux中還有一個用於終止進程的系統調用_exit()。它在Linux系統函數庫unistd.h中被聲明:

void _exit(int status);

其使用方法與exit()徹底相同,可是它只執行終止進程的動做而不對系統內部進行清除。所以,只有那些對系統內部瞭解比較深的程序員才使用它。

 

示例:使用系統調用exit(),終止進程。

#include <stdio.h>

#include <stdlib.h>

 

void main()

{

  printf("My PID is %d\n",getid());

  exit(0);

}

7.1.4 進程的同步

系統調用wait()

進程一旦調用了wait(),就當即阻塞本身,由wait自動分析是否當前進程的某個子進程已經退出,若是讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它完全銷燬後返回;若是沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。

原型:pid_t  wait(int *status);

說明:wait()在系統庫sys/wait.h中聲明。

 

參數status:

參數status用來保存被收集的進程退出時的一些狀態,它是一個指向int類型的指針。但若是對這個子進程是如何死掉的滿不在乎,只想把這個殭屍進程消滅掉,就能夠設定這個參數爲NULL,使用方法以下:

 

pid = wait(NULL);

 

若是成功,wait會返回被收集子進程的ID;若是調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置爲ECHILD。

若是參數status的值不是NULL,wait就會把子進程退出時的狀態取出並存入其中,這是一個整數值,指出了子進程是正常退出仍是非正常結束的,以及正常結束時的返回值,或被哪個信號結束的等信息。

因爲這些信息存放在一個整數的不一樣二進制位中,因此用常規的方法讀取會很是麻煩,人們就設計了一套專門的宏來完成這項工做,下面給出其中最經常使用的兩個:

(1)WIFEXITED(status):這個宏用來指出子進程是否爲正常退出的,若是是,它會返回一個非零值。

(2)EXITSTATUS(status):當WIFEXITED返回非零值時,能夠用這個宏來提取子進程的返回值,若是子進程調用exit(5)退出,EXITSTATUS(status)就會返回5;若是子進程調用exit(7),EXITSTATUS(status)就會返回7。

注意:若是進程不是正常退出的,也就是說,WIFEXITED返回0,這個值就毫無心義。

 

示例:使用wait()系統調用,實現父子進程的簡單同步。

 

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

 

main()

{

  pid_t pc,pr;

  pc=fork();        // 建立進程

  if (pc<0)         // 建立失敗

  {

 printf("error ocurred!\n");

     exit(1);

}

  else

  {

  if (pc == 0)     // 子進程

    {

      printf("This i schild process with pid of %d\n",getpid());

      sleep(10);    // 睡眠10秒鐘

    }

    else           // 父進程

    {

      pr=wait(NULL);    // 在這裏等待

      printf("I catched a child process with pid of %d\n",pr);

    }

  exit(0);       // 結束父進程

}

}//main

7.1.5 進程掛起

系統調用sleep()

sleep()使進程掛起指定的秒數。

原型:unsigned int sleep(unsigned int seconds);

說明:sleep()在系統庫unistd.h中聲明。

該函數調用使得進程掛起一個指定的時間,直到指定時間用完或者收到信號。若是指定掛起的時間到了,該調用返回0;若是該函數調用被信號打斷,則返回剩餘掛起的時間數,即指定的時間減去已經掛起的時間。

 

示例:讓子進程睡眠1分鐘。

 

#include <unistd.h>

#include <stdlib.h>

 

main()

{

  pid_t pc,pr;

  pc=fork();        // 建立進程

  if (pc<0)         // 建立失敗

   {

 printf("error ocurred!\n");

     exit(1);

}

  else

   {

 if (pc == 0)     // 子進程

    {

      printf("This is child process with pid of %d,enter sleep...\n",getpid());

      sleep(60);    // 睡眠60秒鐘

      printf("sleep is over!\n");

    }

    else           // 父進程

    {

      printf("This is parent process with pid of %d,wait child...\n",getpid());

      pr=wait(NULL);    // 在這裏等待

      printf("I catched a child process with pid of %d\n",pr);

    }

  exit(0);       // 結束父進程

  }

}//main

7.2 Linux進程通訊

1、管道

管道,簡單地說就是鏈接一個程序的輸出和另外一個程序的輸入的單向通道。在UNIX/Linux系統的各類進程通訊方法中,它是最古老而應用最爲普遍的一種,特別是在shell中,如:

#ls -l|more

 

2、管道在Linux系統中的模型

當進程建立一個管道的時候,系統內核同時爲該進程設立了一對文件句柄,一個用來從該管道獲取數據(read),另外一個則用來作向管道的輸出(write)。

圖7-1顯示了進程和管道間的相互做用。圖中能夠清楚地看出進程和管道是如何經過句柄進行數據交換的。進程經過句柄fd[0]向管道寫入(write)數據,同時經過fd[1]從管道讀出(read)數據。理解了這一點,咱們就能夠容易地掌握管道I/O處理了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

圖7-1 進程和管理間的相互做用

在主進程中利用fork()函數建立一個自身的自進程。fork()的子進程自動繼承了父進程打開的文件句柄。利用繼承的句柄,就能夠實現父/子間的通訊了。這個關係能夠用圖7-2來表示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

圖7-2 fork()函數調用後的管道

 

如今,父子兩個進程同時擁有對同一個管道的讀寫句柄。管道必須是單向的,由於它沒有提供鎖定的保護機制,因此咱們必須決定數據的流動方向,便是從父到子,仍是從子到父?而後在每一個進程中關閉不須要的句柄。假設須要管道從子進程向父進程傳送數據,那麼關閉相應句柄後的管道能夠用圖7-3來表示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

圖7-3 關閉了相應句柄後的管道

 

這樣,一個完整的管道就被創建了。下面咱們就可使用read()和write()等系統調用來對管道進行讀寫操做了。

 

3、管道的使用

1)系統調用pipe()

pipe()的做用是用來創建管道。

原型:int pipe(int fd[2]);

參數:一個只有兩個整型元素的數組,用於存放pipe()函數新創建的管道句柄。fd[0]用來從管道中讀,fd[1]用來向管道中寫,即fd[1]的寫入由fd[0]讀出。

返回:返回值爲0,成功;

      返回-1,出錯,EMFILE(no free descriptors)無空餘句柄;

                    EMFILE(system file table is full)系統文件分配表滿;

                    EFAULT(fd array is not valid)fd數組非法。

管道創建後,咱們使用fork()創建一個子進程,而後,假設須要管道中數據的流動是從子進程到父進程。這樣父進程就須要關閉(close())寫管道的句柄(fd[1]),而子進程須要關閉讀管道的進程(fd[0])。管道創建以後,咱們就能夠操做管道了。

 

示例:在父子進程間創建管道,且子進程向父進程輸送信息。

 

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

 

int main(void)

{

  int fd[2],nbytes;

  pid_t childpid;

  char string[]="Hello,world!\n";

  char readbuffer[80];

 

  pipe(fd);

  if ((childpid=fork())==-1)

  {

    perror("fork");

    exit(1);

  }

 

  if (childpid==0)

  {

    //子進程關閉管道的讀句柄

    close(fd[0]);

    //經過寫句柄向管道寫入信息

    write(fd[1],string,strlen(string));

    _exit(0);

  }

  else

  {

    //父進程關閉管道的寫句柄

    close(fd[1]);

    //經過讀句柄從管道讀出信息

    nbytes = read(fd[0],readbuffer,sizeof(readbuffer));

    printf("Received string:%s",readbuffer);

  }

  return(0);

}

 

(2)dup()/dup2()系統調用

dup()/dup2()的做用是將管道句柄定向到標準I/O(stdin/stdout)上去。

原型:int dup(int oldfd);

返回:new descriptor on success

      -1 on error:

errno=EBADF(Oldfd is not a valid descriptor)oldfd不是合法的句柄

      EBADF(newfd is out of range)新句柄超界

      EMFILE(too many descriptors for the process)進程可以使用的句柄數已滿

注意:舊句柄沒有被關閉,新舊兩個句柄能夠互換使用。

雖然原句柄和新句柄是能夠互換使用的,但爲了不混淆,一般會將原句柄關閉(close)。同時要注意,在dup()函數中沒法指定重定向的新句柄,系統將自動使用未被使用的最小文件句柄(記住,句柄是一個整型量)做爲重定向的新句柄。

 

示例:dup的使用方法。

......

pipe(fd);

 

childpid=fork();

if (childpid==0)

{

  //關閉子進程的文件句柄0(stdin)

  close(0);

  //將管道的讀句柄定義到stdin

  dup(fd[0]);

  execlp("sort","sort",NULL);

  ......

}

 

例子中巧妙地利用了dup()函數的特性。由於文件句柄0(stdin)被關閉了,對dup函數的調用將管道讀句柄fd[0]定向到了stdin(由於句柄0是最小的未用句柄)。而後調用execlp函數,用外部過程sort覆蓋子進程的代碼。由於它繼承了子進程的基本輸入/輸出,因此它將管道做爲它的輸入。如今,咱們在父進程裏向管道寫入的任何數據都將自動被sort接受進行排序。

在Linux系統中還有一個系統函數dup2()。單從函數名上也能夠判斷出它和dup()函數的淵源。

原型:int dup2(int oldfd,int newfd);

返回:new descriptor on success

      -1 on error:

errno=EBADF(Oldfd is not a valid descriptor)oldfd不是合法的句柄

      EBADF(newfd is out of range)新句柄超界

      EMFILE(too many descriptors for the process)進程可以使用的句柄數已滿

注意:舊句柄將被dup2()自動關閉。

顯然,原來的close以及dup是一套調用如今所有由dup2()來完成。這樣不只簡化了程序,更重要的是,保證了操做的獨立性和完整性,使操做不會被外來的信號所中斷。在原來的dup()調用中,必須先調用close()函數。假設此時剛好有一個信號使接下來的dup()調用不能當即執行,這就會引起錯誤(進程沒有了stdin)。使用dup2()就不會有這樣的危險。

 

示例:dup2()使用方法。

......

pipe(fd);

childpid=fork();

if (childpid==0)

{

  //將管道的讀入端定向到stdin

  dup2(0,fd[0]);

  execlp("sort","stor",NULL);

  ......

}

 

7.3 Linux重定向和管道

 

 

7.4 管理Linux系統進程

 

 

7.5 思考題

一、fork()建立子進程後,子進程在屏幕上顯示:This is child process、My PID(child) is CCC、My parent PID is PPP,父進程在屏幕上顯示:This is parent process、My PID(parent) is PPP、My child PID is CCC。其中PPP爲父進程標識符,CCC爲子進程標識符。

二、請證實下面程序中父子進程是徹底不一樣的兩個進程,即父進程未被子進程覆蓋。

 

#include <stdio.h>

#include <unistd.h>

 

void main()

{

  int pid;

 

  pid = fork();

  switch (pid)

  {

    case -1:

      perror("fork failed");

      exit(1);

    case 0:

      execl("/bin/ls","ls","-l",NULL);

      perror("execl failed");

      exit(1);

    default:

      wait(NULL);

      printf("is completed\n");

      exit(0);

  }//switch (pid)

}

 

3(*)、使用fork()系統調用建立子進程,用wait()系統調用阻塞父進程,直到子進程結束後再喚醒父進程,要求父進程獲取子進程的結束狀態。

4(*)、列舉在管道使用中須要注意的問題。

五、Linux中,提供了輸入/輸出重定向和管道命令

(1)重定向運算符有哪些,各自的做用是什麼?

(2)管道運算符是什麼,其做用是什麼?

(3)採用管道和重定向組合的方法統計出目錄/etc下的文件個數後存入文件count中。

(4)將命令ls、passwd的幫助信息依次存入文件manls。

 

 


【實習報告】

實習報告:Linux併發程序設計

學生姓名:       班級:        學號:

 

1、實習內容

一、Linux進程控制

調試上面7.1 Linux進程控制的各程序代碼。

 

二、Linux進程通訊

  調試上面7.2 Linux進程通訊的各程序代碼。

並完成併發程序設計的實驗內容:

併發程序的設計關鍵是使用建立進程的系統調用,使一個程序運行時能夠生成幾個同時運行的程序,若是程序中沒有建立進程的動做則爲順序程序設計。

本實驗中的併發程序例子完成兩個程序child和father之間的數據傳遞工做,具體作法分爲四步。

步驟1編制併發程序pipeline.c。

單擊紅帽子,在「GNOME幫助」菜單中單擊「附件」-「文本編輯器」命令,在文本編輯中鍵入程序並保存爲pipeline.c。

在該程序中定義管道和文件描述符,而且建立子進程child。該程序用到的系統調用有pipe() 、dup() 、fork() 、close、execl() 、exit,它們的功能分別是創建管道、複製文件描述符、建立進程並使子進程與父進程有相同的程序正文、關閉文件描述符、用指定文件覆蓋調用程序、撤銷當前進程。

    清單4-5 pipeline.c

// 定義管道程序

 

# define STD_INPUT 0                                  // 定義標準輸入設備描述符

# define STD_OUTPUT 1                              // 定義標準輸出設備描述符

 

int fd[2];

 

main()

{

static char process1[]="father",process2[]="child";

               pipe(fd);                                                 // 定義管道

               pipeline(process1,process2);                  // 調用自定義函數pipeline()

               exit(1);                                                   // 程序結束

}

 

pipeline(char* process1,char* process2)

{

          int i;

               while ((i=fork())==-1);                          // 建立進程,直到建立成功爲止

          if (i)

               {

                         close(fd[0]);                                  // 關閉管道輸入描述符

                         close(STD_OUTPUT);                // 關閉標準輸出描述符1

                         dup(fd[1]);                                    // 指定標準輸出描述符1爲管道寫指針

                         close(fd[1]);                                  // 關閉原始管道寫指針

execl(process1, process1, 0);        // 用程序father覆蓋當前程序

                         printf(" father failed.\n");              // execl()執行失敗

               }

               else

               {

                         close(fd[1]);                                  // 關閉管道輸出描述符

                         close(STD_INPUT);                    // 關閉標準輸入描述符0

                         dup(fd[0]);                                    // 指定標準輸入描述符0爲管道讀指針

                         close(fd[0]);                                  // 關閉原始管道讀指針

                         execl(process2,process2,0); // 用程序child覆蓋當前程序

                         printf("child failed.\n");                // execl()執行失敗

               }

               exit(2);                                                   // 程序結束

}

步驟2編制「管道寫」程序father.c做爲父進程的一部分工做。其內容以下:

單擊紅帽子,在「GNOME幫助」菜單中單擊「附件」-「文本編輯器」命令,在文本編輯中鍵入程序並保存爲father.c。

    清單4-6  father.c

 main()

      {

          static char string[] = 「Parent is using pipe write.」 ;

          int len;

          len = sizeof(string) ;

          write(l, string, len) ;                       /* 將string中的內容寫入管道中 */

          printf(「parent, parent, parent \n \n \n」 ) ;

          exit(0) ;

      }

步驟3編制「管道讀」程序child.c做爲子進程的一部分工做。其內容以下:

單擊紅帽子,在「GNOME幫助」菜單中單擊「附件」-「文本編輯器」命令,在文本編輯中鍵入程序並保存爲child.c。

    清單4-7  child.c

     main()

      {

          char output[30] ;

          read (0, output, 30) ;                      /* 從管道中讀數據並存入output中 */

          printf(「%s \n child, child. \n」 , output) ;

          return(0) ;

      }

步驟4編譯。

cc –o child  child.c

cc -o father  father.c

cc -o pipeline  pipeline.c

步驟5運行。

./pipeline

若運行不成功,則應該用文本編輯器對源程序進行修改調試。

運行顯示結果爲:

    ____________________________________________________________________

________________________________________________________________________

________________________________________________________________________

 

三、Linux命令接口管理進程

步驟1:登陸進入GNOME。

在Linux登陸框中填寫指導老師分配的用戶名和口令,登陸Linux系統。

步驟2:訪問命令行。

單擊紅帽子,在「GNOME幫助」菜單中單擊「系統工具」-「終端」命令,打開「終端」窗口。

步驟3:回顧系統進程概念。

每一個運行的程序都會建立一個進程,進程分配到一個惟一的進程標識符 (PID) 。PID被系統用於標識和跟蹤進程,直到進程結束。操做系統內核管理全部進程的初始化和終止。每個進程都要求系統資源 (例如CPU時間和RAM空間) 在其中工做。當進程啓動的時候,操做系統把系統資源分配給每一個進程,當進程終止的時候,系統回收這些資源。在Linux系統啓動的時候,首先啓動的兩個進程是sched (調度) 和init (初始化) ,它們管理着其餘進程。Linux系統中有幾種不一樣類型的進程:

守護進程:由Linux內核啓動的進程,爲了特定目的而存在。例如,lpsched守護進程存在只是爲了處理打印做業。

父進程:派生其餘進程的進程是父進程。一個叫作init的守護進程是第一個調用的進程。每個進程,除了init以外,都有一個父進程。

子進程:由其餘進程派生出來的進程叫作子進程。

孤兒進程:在進程返回輸出以前,它的父進程結束了,這樣的進程叫作孤兒進程。

僵進程:子進程沒有帶着輸出返回給父進程。這樣的進程在系統中變成丟失的進程。

使用此前的信息,完成如下填空:

1) Linux系統中,幾乎每個啓動的進程,都會由內核分配一個惟一的_______________進程標識符,用於跟蹤從進程啓動到進程結束。

2) 當啓動新進程的時候,內核也給它們分配系統資源,如________和________。

3) 永遠不向父進程返回輸出的進程叫作______________。

4) 由父進程派生出來的進程叫作__________________進程。

5) ________________進程是一個派生另外一個進程的進程。

6) 運行用於提供服務的Linux系統進程是_______________。

7) 若是父進程在子進程以前結束,它建立了一個______________進程。

步驟4:回顧ps命令和信息。

ps命令用於列出當前系統中運行的進程。

若是一個進程耗時太長,或者看上去好像已經終止了,表現爲一個終端窗口再也不響應或掛起,一般須要使用ps查看系統中的進程。經過列出進程,能夠查看初始化進程的命令或程序的名字,以及全部它派生出來的子進程。經過屢次執行ps命令,查看進程的時間——進程佔用的CPU時間,能夠檢查一個進程是否還在運行。若是時間小再增加,那麼進程可能已經終止了。若是進程佔用太長的時間或者已經中止,可使用ps命令檢查進程的進程ID (PID) ,而後殺死進程。

ps命令的輸出將顯示PID號和與其相關的命令或程序。PID號一般用於終止一個進程。ps命令 ( ps [-options] ) 的3個主要選項以下表所示。

 

表3-5  ps命令選項

ps選項

意義

功能

Ps

無選項

顯示當前shell或終端窗口中,當前用戶的進程信息

ps –e

每個

顯示系統中每個進程的信息

ps –f

徹底

產生一個徹底列表,給出每一個進程的全部可用信息

ps -u userid

用戶

顯示特定用戶的全部進程

 

基本的ps命令顯示在當前shell中的進程信息,用戶只可以查看在這個終端窗口中初始化的進程。輸入ps命令,將結果填入表3-6中。

 

表3-6  實驗記錄

PID

TTY

TIME

CMD

 

 

 

 

 

 

 

 

 

 

 

 

 

從當前終端窗口中,練習使用給出的每一個選項的ps命令。

輸入 ps -f 命令,顯示運行在系統中的某個進程的徹底信息,填入表3-7中。

 

表3-7  實驗記錄

UID

PID

PPID

C

STIME

TTY

TIME

CMD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ps -f命令輸出的各欄標題見表3-8所示。

 

表3-8  ps -f欄標題

描述

UID

初始化進程的用戶ID

PID

進程的進程標識號。PID能夠用來殺死進程

PPID

  進程的父進程標識號

C

  進程的優先級

STIME

進程的啓動時間

TTY

控制進程終端的終端舉型

TIME

進程使用的CPU時間的數量

CMD

命令名守護進程 (執行的程序的名字)

 

步驟5:列出系統中運行的全部進程。

輸入 ps -ef 命令,顯示運行在系統中的各個進程的徹底信息。執行該命令,並與ps –f命令的輸出結果對照,一致嗎?有何不一樣?

____________________________________________________________________

________________________________________________________________________

注意分析當前終端窗口中的輸出結果:

a. 顯示了多少個進程?

____________________________________________________________________

b. 進程ID的PID是什麼?

____________________________________________________________________

c. 啓動進程的命令 (CMD) 是什麼?

____________________________________________________________________

d. 請觀察,什麼命令的PID號是1?

____________________________________________________________________

e. 再次運行ps –ef命令,計算進程的數目:

____________________________________________________________________

而後執行下列命令把輸出結果輸入到wc命令中:

              ps -ef | wc -l

第一個數字顯示的是行的數目,也是進程的數目:

____________________________________________________________________

執行 man ps命令,能夠打開Linux用戶命令手冊,瞭解ps命令的用法,輸入wq命令可退出用戶手冊的閱讀。man命令能夠執行嗎?結果如何?

____________________________________________________________________

步驟6:根據命令名搜索特定的進程。

爲了終止一個進程,必須找到該進程的PID。大多數運行的系統中,有上百個進程在運行,ps -ef的列表可能很長。若是知道啓動進程的執行程序的名字,能夠更快地找到PID。

經過把ps命令的輸出結果輸入到grep中,能夠搜索想要終止的特定進程,肯定正確的PID。

grep命令能夠在其餘命令的輸出中搜索全部類型的特徵字符串。-l (長的輸出) 選項將顯示和找到的PID相關的進程的名字;-e選項顯示PID和初始化命令的名字。

a. 單擊紅帽子,在「GNOME幫助」菜單中單擊「遊戲」-「堆麻將」命令,打開「堆麻將」遊戲。

b. 在當前的終端窗口中,執行命令:

ps –e | grep mahjongg

 (「堆麻將」遊戲的進程名是「mahjongg」) ,查找和「堆麻將」遊戲調度守護進程相關的全部進程。

c. 顯示了多少個相關進程?

____________________________________________________________________

d. 顯示進程中最小的進程ID號是多少?

       ____________________________________________________________________

c. 在當前終端窗口中執行命令:

pgrep –l mahjongg

查找全部和「堆麻將」遊戲調度守護進程相關的進程。ps和pgrep命令輸出之間有什麼不一樣?

       ____________________________________________________________________

步驟7:肯定一個要終止的進程。

當試圖終止一個程序,或者釋放一個掛起的終端窗口的時候,殺死和不響應的應用相關的PID可能仍是不夠的,通常須要殺死那個進程的父進程,在少數狀況下,甚至要殺死父進程的父進程。爲了沿着層次結構,從子進程追溯到派生它們的父進程,必須可以查找PID和PPID。

必須首先肯定最低級不響應進程的PID。一般,能夠試着去殺死那個進程。若是這樣作不可以中止那個進程,可能須要殺死它的父進程。殺死父進程將殺死全部它派生的子進程。殺死一個父進程也比殺死幾個子進程快得多。

1) 在GNOME當前終端窗口中,輸入ps命令。

有多少進程正在運行?爲何只有這麼少的進程?

       ____________________________________________________________________

2) 正在運行的進程的名字是什麼?它表示什麼?

       ____________________________________________________________________

3) 這個進程的PID是多少?

       ____________________________________________________________________

4) 在bash shell中輸入命令csh,打開一個C shell會話,當前系統的會話提示符是什麼?

       ____________________________________________________________________

5) 輸入 ps -f 命令,顯示在當前shell中運行的進程的全部信息。如今什麼進程正在運行?

       ____________________________________________________________________

6) bash的PID是-sh (csh) 的PPID嗎?

       ____________________________________________________________________

7) 輸入命令sleep l000&,建立一個進程,把執行掛起1000秒 (大約15分鐘) 。&表示在後臺運行命令,返回shell提示符,這樣您能夠繼續工做。

8) 再次輸入ps -f命令。-sh (csh) 的PID是sleep命令的PPID嗎?哪一個PID是csh (C shell) 的子進程?

       ____________________________________________________________________

________________________________________________________________________

9) 輸入命令 kill -9 <csh的PID> 退出C shell。而後再次鍵入ps -f命令。什麼PID是sleep父命令的PPID?

       ____________________________________________________________________

sleep進程如今是什麼類型的進程?

       ____________________________________________________________________

步驟8:使用kill命令終止一個進程。

信號用於終止、掛起和繼續進程。有時候使用Ctrl + c能夠終止一個不響應的進程。這樣向進程發送一箇中斷 (INT) 信號,終止它及全部它派生的子進程。

kill命令提供了一個終止不想要的命令進程的直接方法。當想中止一個運行了很長時間的命令的時候,或者當須要終止一個不可以正常退出的進程的時候,它頗有用。指定PID正常地殺死一個進程。

  kill [-signal] process -id

爲了使用kill命令終止一個進程,應該首先鍵入ps找出進程的PID,而後鍵入kill緊跟着PID。若是使用kill而沒有指定信號,則信號15 (SIGTERM) 將被髮送給特定PID號的進程。這叫作軟殺死,一般終止了進程。若是可能,最好軟殺死進程,這樣它能夠正確地關閉文件,溫和地終止進程。

若是須要強制終止一個進程,可使用帶 -9選項的kill命令。這個選項叫作強制殺死,當shell對全部其餘終止信號都不響應的時候,須要使用它來殺死shell。

  kill -9 process -id

注意:對於shell以外的進程,把kill –9 (SIGKILL) 做爲最後的選項,由於它是一種生硬的方法,不容許正確的進程終止。

a. 輸入命令ps –f ,顯示在當前shell中運行的進程的完整信息。如今什麼進程正在運行?

       ____________________________________________________________________

b. 由於sleep進程如今是一個孤兒進程,已經被init進程 (PID #l) 收養,輸入命令,對sleep的PID執行軟殺死。若是sleep已經終止 (超過15分鐘) ,則重複步驟7中的8) 、9) 操做,而後軟殺死sleep程序。再次輸入ps -f命令。如今什麼進程正在運行?

       ____________________________________________________________________

步驟9:按照用戶查找和終止一個進程。

ps命令能夠帶 -u (用戶) 選項使用,查找指定用戶的進程。這個命令比ps-ef使用得更多,由於通常只可以管理屬於本身的進程。咱們能夠經過用戶登陸名或者UID號來查找用戶的進程。用戶只可以終止本身的進程,可是超級用戶能夠終止系統中全部運行的進程。

      ps –u login-ID或UID

1) 啓動計算器和「堆麻將」遊戲GNOME應用程序。

2) 使用帶 -u選項的ps命令,查找以登陸ID (例如,userX) 或者數字UID (例如,1004) 運行的全部進程。計算器應用程序的PID是什麼?

       ____________________________________________________________________

3) 使用軟殺死終止計算器應用程序,「堆麻將」是否仍然在桌面上運行?

    ____________________________________________________________________

4) 使用ps -u命令組合grep,查找「堆麻將」程序的PID號,而不是使用ps -u查找整個列表。您使用什麼命令?

提示:猜猜「堆麻將」程序的命令名中可能有哪一個字母,使用grep搜索那些字母。

       ____________________________________________________________________

5) 終止「堆麻將」程序。它是否還在桌面上運行?

     ____________________________________________________________________

6) 退出 C shell。

步驟10:刪除全部在本實驗中建立的文件和目錄。

 

四、Linux命令接口的重定向與管道

 

1. 使用重定向標準輸出符號

 

步驟3:重定向標準輸出,建立一個文件。

右尖括號或稱大於符號 (>) 把命令的輸出發送到一個文件中:使用單個右尖括號,當指定文件名不存在的時候,將建立一個新文件;若是文件名存在,它將被覆蓋。(注意:命令、重定向符號和文件名之間的空格是可選的) 。

重定向標準輸出命令的格式是:

      command > file

1) 爲覈實當前所在目錄位置,使用什麼命令?

    ____________________________________________________________________

若是當前位置不在主目錄中,使用什麼命令能夠改變到主目錄中?

    ____________________________________________________________________

2) 若是但願把文件和目錄列表截獲,存儲爲主目錄中的一個文件,這樣能夠追蹤主目錄中有什麼文件。使用什麼命令,把長文件列表的輸出重定向,建立一個叫作homedir.list的文件。

    ____________________________________________________________________

3) 新文件homedir.list被放在哪裏?

    ____________________________________________________________________

使用ls命令覈實新文件存在。

4) 使用什麼命令,以一次一屏的方式,來查看剛纔建立的文件內容?

    ____________________________________________________________________

5) 使用head命令截獲homedir.list文件的前10行,經過重定向,建立一個叫作dhomedir.list-top-10的新文件。應該使用什麼命令?

    ____________________________________________________________________

使用more命令查看文件的內容。

6) 使用tail命令,截獲homedir.list文件的最後10行,經過重定向,建立一個叫作dhomedir.list-top-10的新文件。使用什麼命令?

    ____________________________________________________________________

使用more命令查看文件的內容。

7) 截獲cal -y命令的輸出,把它存到名爲calendar的文件中。查看文件的內容。截獲了什麼?

    ____________________________________________________________________

8) 截獲cal 2010命令的輸出,把它存到名爲calendar的文件中。查看文件的內容。其中有什麼內容?

    ____________________________________________________________________

日曆有什麼變化?

    ____________________________________________________________________

步驟4:防止使用重定向的時候覆蓋文件。

在bash shell中,一個叫作noclobber的選項能夠用來設定防止在重定向的過程當中覆蓋文件。能夠在命令行中使用$set -o noclobber命令來完成。o表明選項。

爲了從新激活clobber特性,使用$set -o noclobber;撤消則用set +o noclobber。

若是你使用的是csh shell,爲了激活/撤消C shell中的clobber特性,使用set noclobber和unset noclobber。

1) 輸入命令,打開shell中的noclobber選項。輸入什麼命令?

    ____________________________________________________________________

2) 輸入命令ls -l > homedir.list,結果是什麼?

    ____________________________________________________________________

3) 輸入命令ls -l > homedir.list2,結果是什麼?

    ____________________________________________________________________

步驟5:向現有的文件追加輸出。

若是想向一個現有的文件追加 (添加到末尾) 文本而不是覆蓋它,可使用雙右尖括號 (>>) 。這個選項當文件不存在的時候,會建立一個新文件,或者追加到已有文件。

追加命令的格式是:

      command >> file

1) 輸入命令,顯示「Happy Bday」一行字,使用重定向符號截獲輸出,把它存到叫作bday4me的文件中。使用什麼命令?

    ____________________________________________________________________

2) 輸入命令,顯示「YOURNAME!」一行字,使用雙重定向符號,把輸出追加到bday4me文件中。查看bday4me文件的內容。其中有什麼?

    ____________________________________________________________________

3) 輸入命令,顯示您出生年月的日曆 (若是在1985年的6月出生,輸入cal 6 1985) ,使用雙重定向符號,把輸出追加到bday4me文件中。使用什麼命令?

    ____________________________________________________________________

4) 查看bday4me文件的內容。注意這3個命令的輸出在bday4me文件中已經被組合起來了。您是在一週中的哪一天出生的?

____________________________________________________________________

 

2. 使用管道符號

 

步驟6:把命令的輸出導入到另外一個命令中。

1) 使用管道元字符,發送ls -l命令的輸出,做爲more命令的輸入 (注意:若是在當前目錄中沒有太多的文件,使用 /etc目錄獲取長列表) 。把輸出做爲more命令的輸入的時候,獲得什麼結果?

    ____________________________________________________________________

2) 查看使用ls –l | more命令列出來的文件,注意建立或修改的日期。爲了查看在同一個月被建立或修改的文件或目錄的列表,可使用grep命令對那個月進行搜索。當月份顯示在列表中的時候,指定它 (例如:Oct) 。輸入命令ls -1 | grep Oct (或者想查找的月份) 。結果是什麼?

    ____________________________________________________________________

3) 目錄老是4096字節大小。輸入命令ls -1 | grep 4096。產生的列表是什麼?

    ____________________________________________________________________

________________________________________________________________________

4) 可使用多個管道鏈接多個命令。輸入取得長文件列表輸出的命令,把它輸入給tail命令,而後到sort命令。輸入的命令是:

    ____________________________________________________________________

5) ps (進程狀態) 命令用於查看Linux系統中運行什麼進程。把ps -e命令的輸出輸入給more命令。-e選項將給出每個在系統中運行的進程。把輸出輸入到more命令中的結果是什麼?

    ____________________________________________________________________

步驟7:刪除在本實驗中建立的文件和目錄。

步驟8:關閉終端窗口,註銷。

可選練習

1. 使用set -o命令不指定任何選項,能夠查看noclobber特性是否已經打開。

1) 輸入set -o。noclobber特性打開仍是關閉的?若是它是關閉的,打開它。使用什麼命令?

    ____________________________________________________________________

2) 永久的關閉noclobber特性。使用什麼命令?

    ____________________________________________________________________

2. 能夠把管道和重定向組合起來使用,達到特殊的效果。輸入命令建立一個名爲top5.list的文件,內容爲主目錄中的頭5行記錄,使用什麼命令?

    ____________________________________________________________________

 

 

 

 

2、實習總結

 

 

 


 

 

【實習報告】

實習報告  綜合應用

學生姓名:       班級:        學號:

 

1、實習內容

一、設計並實現Linux進程併發的應用程序――音畫同步

要求:

(1)至少兩個進程併發,一個子進程爲揚聲器唱歌,父進程爲動畫進程。

(2)進程同步與通訊,子進程每唱一句,父進程動態顯示歌詞(或情景畫面)。

 

 

 

 

2(*)、自行設計一個應用主題,需多於兩個進程的併發

 

 

 

 

2、實習總結

相關文章
相關標籤/搜索