嵌入式Linu期末復習_第1頁
嵌入式Linu期末復習_第2頁
嵌入式Linu期末復習_第3頁
嵌入式Linu期末復習_第4頁
嵌入式Linu期末復習_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

P8文件屬性

Linux中的文件屬性如圖1.6如示。

可讀可寫可執(zhí)行

首先,Linux中文件的擁有者可以把文件的訪問屬性設成3種不同的訪問權限:

可讀(r)、可寫(w)和可執(zhí)行(x)。文件又有3個不同的用戶級別:文件擁有者(u)、

所屬的用戶組(g)和系統(tǒng)里的其他用戶(。)。

第一個字符顯示文件的類型。

■表示普通文件。

■“d”表示目錄文件。

■“1”表示鏈接文件。

■“c”表示字符設備。

■“b”表示塊設備。

■“p”表示命名管道,比如FIFO文件(FirstInFirstOut,先進先出)。

■“f”表示堆棧文件,比如LIFO文件(LastInFirstOut,后進先出)。

■“s”表示套接字。

第一個字符之后有三個三位字符組:

■第一個三位字符組表示文件擁有者(u)對該文件的權限。

■第二個三位字符組表示文件用戶組(g)對該文件的權限。

■第三個三位字符組表示系統(tǒng)其他用戶(。)對該文件的權限。

■若該用戶組對此沒有權限,一般顯示字符。

目錄權限和文件權限有一定的區(qū)別。對于目錄而言,I?代表允許列出該目錄下的

文件和子目錄,W代表允許生成和刪除該目錄下的文件,X代表允許訪問該目錄

P14用戶切換(SU)

(1)作用。

變更為其他使用者的身份,主要用于將普通用戶身份轉變?yōu)槌売脩?,而且需?/p>

入相應用戶密碼。

(2)格式。

su[選項][使用者]

其中的使用者為要變更的對應使用者。

(3)常見參數(shù)。主要選項參數(shù)如表2』su命令常見參數(shù)列表

選項參數(shù)含義

-1,--login為該使用者重新登錄,大部分環(huán)境變量(如HOME、SHELL和USER等)和

工作目錄都是以該使用者(USER)為主。若沒有指定USER,缺省情況是root

-m,-p執(zhí)行su時不改變環(huán)境變量

-c,-command變更賬號為USER的使用者,執(zhí)行指令(command)后再變回原來使用者

(4)使用示例。

[david@localhost~]$su-root

Password:

[root@localhost

示例通過su命令將普通用戶變更為root用戶,并使用選項攜帶root環(huán)境變量。

(5)使用說明。

■在將普通用戶變更為root用戶時建議使用選項,這樣可以將root的環(huán)境變量

和工作目錄同時帶入,否則在以后的使用中可能會由于環(huán)境變量的原因而出錯。

■在轉變?yōu)閞oot權限后,提示符變?yōu)?。

P15用戶管理(useradd和passwd)

(1)作用。

①useradd:添加用戶賬號。

②passwd:更改對應用戶的賬號密碼。

(2)格式。

①useradd:useradd[選項]用戶名。

②passwd:passwd[選項J[用戶名]。

其中的用戶名為修改賑號密碼的用戶,若不帶用戶名,缺省為更改當前使用者的密碼。

(3)常用參數(shù)

①useradd主要選項參數(shù)如表2.3所示。uscradd命令常見參數(shù)列表

選項參數(shù)含義

-g指定用戶所屬的群組

-m自動建立用戶的登入目錄

-n取消建立以用戶名稱為名的群組

②passwd:一般很少使用選項參數(shù)。

(4)使用實例。

(root0localhostuseradddavid

(root0localhostpasswddavid

Newpassword:(輸入密碼)

Retypenewpassword:(再輸入一次密碼,以確認輸入的正確性)

passwd:allauthenticationtokensupdatedsuccessfully

[root@localhostsu-david

[david@localhost

[david@localhost~]$pwd(查看當前目錄)

/home/david(該用戶的工作目錄)

實例中先添加了用戶名為david的用戶,接著又為該用戶設置了賬號密碼。

從su的命令可以看出,該用戶添加成功,其工作目錄為“/home/david”。

(5)使用說明。

■在添加用戶時I這兩個命令是一起使用的,其中,useradd必須用root的權限。

而且useradd指令所建立的賬號,實際上是保存在“/etc/passwd”文本文件中,

文件中每一行包含一個賬號信息。

■在缺省情況下,useradd所做的初始化操作包括在“/home”目錄下為對應賬

號建立一個同名的主目錄,并且還為該用戶單獨建立一個與用戶名同名的組。

■adduser只是useradd的符號鏈接(關于符號鏈接的概念在本節(jié)后面會有介紹),

兩者是相同的。

■passwd還可用于普通用戶修改賬號密碼,Linux并不采用類似Windows的密

碼回顯(顯示為*號),所以輸入的這些字符用戶是看不見的。密碼最好包括

字母、數(shù)字和特殊符號,并且設成6位以上。

P17系統(tǒng)管理命令(ps和kill)

(1)作用。

①ps:顯示當前系統(tǒng)中由該用戶運行的進程列表。

②kill:輸出特定的信號給指定PID(進程號)的進程,并根據(jù)該信號完成指定

的行為。其中可能的信號有進程掛起、進程等待、進程終止等。

(2)格式。

①ps:ps[選項]。②kill:kill[選項]進程號(PID)。

kill命令中的進程號為信號輸出的指定進程的進程號,當選項是缺省時為輸出終

止信號給該進程.

(3)常見參數(shù)。

①ps主要選項參數(shù)如表2.5所示。ps命令常見參數(shù)列表

選項參數(shù)含義

-ef查看所有進程及其PID(進程號)、系統(tǒng)時間、命令詳細目錄、執(zhí)行者等

-aux除可顯示vf所有內容外,還可顯示CPU及內存占用率、進程狀態(tài)

-w顯示加寬并且可以顯示較多的信息

②kill主要選項參數(shù)如表2.6所示。kill命令常見參數(shù)列表

選項參數(shù)含義

-S將指定信號發(fā)送給進程

-P打印出進程號(PID),但并不送出信號

-1列出所有可用的信號名稱

(4)使用實例。

[root@localhostroot]#ps-ef

UIDPIDPPIDCSTIMETTYTIMECMD

root1002005?00:00:05init

root2102005?00:00:00[keventd]

root3002005?00:00:00[ksoftirqd_CPU0]

400200500:00:00[ksoftirqd_CPUl]

root7421102005?00:00:00/usr/local/bin/ntpd-c/etc/ntp.

root2178721739017:16pts/100:00:00grepntp

[root@localhostroot]#kill-97421(殺死進程)

〔root@localhostroot]#ps-ef|grepntp

root2178921739017:16pts/100:00:00grepntp

該實例中首先查看所有進程,并終止進程號為7421的ntp進程,之后再次查看時

已經沒有該進程號的進程。

(5)使用說明。

■ps在使用中通??梢耘c其他一些命令結合起來使用,主要作用是提高效率。

■ps選項中的參數(shù)w可以寫多次,通常最多寫3次,它的含義為加寬3次,

這足以顯示很長的命令行了。例如:ps-auxwwwo

P19文件系統(tǒng)掛載命令(mount)

(1)作用。

掛載文件系統(tǒng),它的使用權限是超級用戶或/etc/fstab中允許的使用者。正如1.2.1

節(jié)中所述,掛載是指在分區(qū)和目錄之間建立映射關系的過程,而掛載點是指掛載在文

件樹中的位置。使用mount命令可以把文件系統(tǒng)掛載到相應的目錄下,并且由于Linux

中把設備都當成文件一樣使用,因此,mount命令也可以掛載不同的設備。

通常,在Linux下“/mnt”目錄是專門用于掛載不同的文件系統(tǒng)的,它可以在該

目錄下新建不同的子目錄來掛載不同的設備文件系統(tǒng)。

(2)格式。

mount[選項][類型]設備文件名掛載點目錄

其中的類型是指設備文件的類型。

(3)常見參數(shù)

mount常見參數(shù)如表2.8所示。mount命令選項常見參數(shù)列表

選項參數(shù)含義

-a依照/etc/fstab的內容裝裁所有相關的硬盤

-1列出當前已掛載的設備、文件系統(tǒng)名稱和掛載點

-t類型將后面的設備以指定類型的文件格式裝載到掛載點上。常見的類型有前面介紹過

的幾種:vfat、ext3、ext2>iso9660、nfs等

-f通常用于除錯。它會使mount不執(zhí)行實際掛上的動作,而是模擬整個掛上的過程,通常會和

-V一起使用

(4)使用實例。

使用mount命令主要通過以下幾個步驟。

①確認是否為Linux可以識別的文件系統(tǒng),Linux可識別的文件系統(tǒng)只要是以下兒種。

■Windows95/98常用的FAT32文件系統(tǒng):vfat。

■WindowsNT/2000的文件系統(tǒng):ntfs。

■OS/2用的文件系統(tǒng):hpfso

■Linux用的文件系統(tǒng):ext2、ext3、nfs?

■CD-ROM光盤用的文件系統(tǒng):iso9660。

②確定設備的名稱,可通過使用命令"fdisk-1”查看。

③查找掛載點。

必須確定掛載點已經存在,也就是在“/mnt”下的相應子目錄已經存在,一般建

議在“/mnt”下新建幾個如“/mnt/windows",“/mnt/usb”的子目錄,現(xiàn)在有些新版本

的Linux(如Fedora、Ubuntu、紅旗Linux、中軟Linux、MandrakeLinux)都可自動

掛載文件系統(tǒng),RedHatLinux僅可自動掛載光驅。

④掛載文件系統(tǒng)如下所示。

[root@locaohostmkdir-p/mnt/win/c

[root@locaohostmount-tvfat/dev/hdal/mnt/win/c

[root@localhostcd/mnt/win/c

24.s03e01.pdtv.xvid-sfm.rmvbDocumentsandSettingsProgramFiles

24.s03e02.pdtv.xvid-sfm.rmvbDownloadsRecycled

C盤是原先筆者Windows系統(tǒng)的啟動盤。可見,在掛載了C盤之后,可直接訪

問Windows下的C盤的內容。

⑤在使用完該設備文件后可使用命令umount將其卸載。

[root@localhostumount/mnt/win/c

[root@localhost-]#cd/mnt/win/c

[root@localhostIs/mnt/win/c

可見,此時目錄“/mnt/win/c”下為空。Windows下的C盤已被成功卸載。

P21cd和Is

1.cd

(1)作用。

改變當前工作目錄。

(2)格式。

cd[路徑]

其中的路徑為要改變的工作目錄,可為相對路徑或絕對路徑。

(3)使用實例。

(root@localhostcd/home/david/

[root0localhostdavid]#pwd

[root@localhostdavid]#/home/david/

該實例中變更工作目錄為“/home/david/",在后面的“pwd”(顯示當前目錄)的結果中可

以看出。

(4)使用說明。

■該命令將當前目錄改變至指定路徑的目錄。若沒有指定路徑,則回到用戶的

主目錄(例如:”/home/david”為用戶david的主目錄)。為了改變到指定目

錄,用戶必須擁有對指定目錄的執(zhí)行和讀權限。

■該命令可以使用通配符。

■使用“cd可以回到前次工作目錄。

■代表當前目錄,代表上級目錄。

2.Is

(1)作用

列出目錄和文件的信息。

(2)格式。

1s[選項][文件]

其中文件選項為指定查看指定文件的相關內容,若未指定文件,默認查看當前目

錄下的所有文件。

(3)常見參數(shù)。

1s主要選項參數(shù)見表2.9所示。1s命令常見參數(shù)列表

選項參數(shù)含義

-1?-format=single-column一行輸出一個文件(單列輸出)

-a,-all列出目錄中所有文件,包括以開頭的隱藏文件

-d將目錄名和其他文件一樣列出,而不是列出目錄的內容

-l,-fbrmat=long,除每個文件名外,增加顯示文件類型、權限、硬鏈接數(shù)、所有者名、

-fbrmat=verbose組名、大小(Byte)及時間信息(如未指明是其他時間即指修改時間)

-f不排序目錄內容,按它們在磁盤上存儲的順序列出

(4)使用實例。

[david@localhosttest]$Is-1

total220

drwxr-xr-x2rootroot4096Mar312005bin

drwxr-xr-x3rootroot4096Apr32005boot

-rw-r——r——1rootroot0Apr242002test.run

該實例查看當前目錄下的所有文件,并通過選項“-1”顯示出詳細信息。

顯示格式說明如下。

文件類型與權限鏈接數(shù)文件屬主文件屬組文件大小修改的時間名字

(5)使用說明。

■在1s的常見參數(shù)中,-1(長文件名顯示格式)的選項是最為常見的??梢栽?/p>

細顯示出各種信息。

■若想顯示出所有開頭的隱藏文件,可以使用-a,這在嵌入式開發(fā)中很常用。

P23cat

(1)作用。

連接并顯示指定的一個或多個文件的有關信息。

(2)格式。

cat[選項]文件1文件2“?

其中的文件1、文件2為要顯示的多個文件。

(3)常見參數(shù)。

cat命令的常見參數(shù)如表2.11所示。cat命令常見參數(shù)列表

選項參數(shù)含義

-n由第一行開始對所有輸出的行數(shù)編號

-b和-n相似,只不過對于空白行不編號

(4)使用實例。

(david@localhost~]$cat-nhellol.chello2.c

1#include<stdio.h>

2voidmain()

3(

4printf("Hello!Thisismyhome!\nH);

5}

6#include<stdio.h>

7voidmain()

8(

9printf(*'Hello!Thisisyourhome!\nn);

10)

在該實例中,指定對hellol.c和hello2.c進行輸出,并指定行號。

P24cp、mv和rm

(1)作用。

①cp:將給出的文件或目錄復制到另一文件或目錄中。

②mv:為文件或目錄改名或將文件由一個目錄移入另一個目錄中。

③rm:刪除一個目錄中的一個或多個文件或目錄。

(2)格式。

①cp:cp[選項]源文件或目錄目標文件或目錄

②mv:mv[選項]源文件或目錄目標文件或目錄

③nn:rm[選項]文件或目錄

(3)常見參數(shù)。

①cp主要選項參數(shù)如表2.12所示。cp命令常見參數(shù)列表

選項參數(shù)含義

-a保留鏈接、文件屬性,并復制其子目錄,其作用等于dpr選項的組合

-d復制時保留鏈接

-f刪除已經存在的S標文件而不提示

-i在覆蓋目標文件之前將給出提示要求用戶確認。回答y時目標文件將被覆蓋,而且是交互式復制

-P此時cp除復制源文件的內容外,還將把其修改時間和訪問權限也復制到新文件中

-r若給出的源文件是?個目錄文件,此時cp將遞歸復制該目錄下所有的子目錄和文件。此時目標文件

必須為一個目錄名

②mv主要選項參數(shù)如表2.13所示。mv命令常見參數(shù)列表

選項參數(shù)含義

-i若mv操作將導致對已存在的目標文件的覆蓋,此時系統(tǒng)詢問是否重寫,并要求用戶回答y或n,

這樣可以避免誤覆蓋文件

-f禁止交互操作。在mv操作要覆蓋某已有的目標文件時不給任何指示,在指定此選項后,

i選項將不再起作用

③rm主要選項參數(shù)如表2.14所示。nn命令常見參數(shù)列表

選項參數(shù)含義

-i進行交互式刪除

-f忽略不存在的文件,但從不給出提示

-r指示rm將參數(shù)中列出的全部目錄和子目錄均遞歸地刪除

(4)使用實例。

①卬

(root@wwwhello]#cp-a./my/why/./

(root@wwwhello]#Is

mywhy

該實例使用-a選項將“/my/why”目錄下的所有文件復制到當前目錄下。而此時

在原先目錄下還有原有的文件。

②mv

[root@wwwhello]#mv-i./my/why/./

[rootQwwwhello]#Is

mywhy

該實例中把,,/my/why”目錄下的所有文件移至當前目錄,則原目錄下文件被自動刪除。

③rm

[root@wwwhello]#rm-r-i./why

rm:descendintodirectory*./why*?y

rm:remove*./why/my.c*?y

rm:removedirectory*./why*?y

該實例使用“-r”選項刪除“./why”目錄下所有內容,系統(tǒng)會進行確認是否刪除。

(5)使用說明。

①卬:該命令把指定的源文件復制到目標文件,或把多個源文件復制到目標目錄中。

②mv

■該命令根據(jù)命令中第二個參數(shù)類型的不同(是目標文件還是目標目錄)來判

斷是重命名還是移動文件,當?shù)诙€參數(shù)類型是文件時,mv命令完成文件

重命名,此時,它將所給的源文件或目錄重命名為給定的目標文件名;

■當?shù)诙€參數(shù)是已存在的目錄名稱時,mv命令將各參數(shù)指定的源文件均移

至目標目錄中;

■在跨文件系統(tǒng)移動文件時,mv先復制,再將原有文件刪除,而連至該文件

的鏈接也將丟失。

③rm

■如果沒有使用-r選項,則rm不會刪除目錄:

■使用該命令時一旦文件被刪除,它是不能被恢復的,所以最好使用-i參數(shù)。

P27chmod

7.chmod

(1)作用。

改變文件的訪問權限。

(2)格式。

chmod可使用符號標記進行更改和八進制數(shù)指定更改兩種方式,因此它的格式也

有兩種不同的形式。

①符號標記:chmod[選項]…符號權限[符號權限]…文件

其中的符號權限可以指定為多個,也就是說,可以指定多個用戶級別的權限,但

它們中間要用逗號分開表示,若沒有顯式指出則表示不作更改。

②八進制數(shù):chmod[選項]…八進制權限文件…

其中的八進制權限是指要更改后的文件權限。

(3)選項參數(shù)。

chmod主要選項參數(shù)如表2.16所示。表2.16chmod命令常見參數(shù)列表

選項參數(shù)含義

-C若該文件權限確實已經更改,才顯示其更改動作

-f若該文件權限無法被更改也不要顯示錯誤信息

-V顯示權限變更的詳細資料

(4)使用實例。

chmod涉及文件的訪問權限,在此對相關的概念進行簡單的回顧。

在1.3.1節(jié)中已經提到,文件的訪問權限可表示成:-rwxrwxrwx。在此設有3

種不同的訪問權限:讀(r)、寫(w)和運行(x)。3個不同的用戶級別:文件擁有者

(u)、所屬的用戶組(g)和系統(tǒng)里的其他用戶(o)。在此,可增加一個用戶級別a(all)

來表示所有這3個不同的用戶級別。

①第一種符號連接方式的chmod命令中,用加號“+”代表增加權限,用減號“-”

代表刪除權限,等于號“=”代表設置權限。

例如,原先筆者系統(tǒng)中有文件uClinux20031103.tgz,其權限如下所示。

[root@localhosttest]#Is-1

-rw-r-r-1rootroot79708616Mar242005

uClinux20031103.tgz

[root0localhosttest]#chmoda+rxzu+wuClinux20031103.tgz

[root@localhosttest]#Is-1

-rwxr-xr-x1rootroot79708616Mar242005

uClinux20031103.tgz

可見,在執(zhí)行了chmod之后,文件擁有者除擁有所有用戶都有的可讀和執(zhí)行的權

限外,還有可寫的權限。

②對于第二種八進制數(shù)指定的方式,將文件權限字符代表的有效位設為“1”,

即“rw-”“rw-”和“…”的八進制表示為“110”、“110”、“100”,把這個二進制串

轉換成對應的八進制數(shù)就是6、6、4,也就是說該文件的權限為664(三位八進制數(shù))。

這樣對于轉化后八進制數(shù)、二進制及對應權限的關系如表2.17所示。

表2.17轉化后八進制數(shù)、二進制及對應權限的關系

轉換后八進制數(shù)-進制對應權限轉換后八進制數(shù)二進制對應權限

0000沒有任何權限1001只能執(zhí)行

2010只寫3011只寫和執(zhí)行

4100只讀5101只讀和執(zhí)行

6110讀和寫7111讀、寫和執(zhí)行

同上例,原先筆者系統(tǒng)中有文件genromfs-0.5.1.tar.gz,其權限如下所示。

[root@localhosttest]#Is-1

-rw-rw-r——1daviddavid20543Dec292004

genromfs-0.5.1.tar.gz

[root0localhosttest]#chmod765genromfs-0.5.1.tar.gz

[root@localhosttest]#Is-1

-rwxrw-r-x1daviddavid20543Dec292004

genromfs-0.5.1.tar.gz

可見,在執(zhí)行了chmod765之后,該文件的擁有者權限、文件組權限和其他用戶

權限都恰當?shù)貙恕?/p>

(5)使用說明

■使用chmod必須具有root權限。

P31In

(1)作用。

為某一個文件在另外一個位置建立一個符號鏈接。當需要在不同的目錄用到相同

的文件時,Linux允許用戶不用在每一個需要的目錄下都存放一個相同的文件,而只

需將其他目錄下的文件用In命令鏈接即可,這樣就不必重復地占用磁盤空間。

(2)格式。

In[選項]目標目錄

(3)常見參數(shù)。

■-s建立符號鏈接(這也是通常惟一使用的參數(shù))。

(4)使用實例。

[root@localhosttest]#In-s../genromfs-0.5.1.tar.gz./hello

[root@localhosttest]#Is-1

total77948

Irwxrwxrwx1rootroot24Jan1400:25hello

->../genromfs-0.5.1.tar.gz

該實例建立了當前目錄的hello文件與上級目錄之間的符號鏈接,可以看見,在

hello的Is-1中的第一位為“1”,表示符號鏈接,同時還顯示了鏈接的源文件。

(5)使用說明。

■In命令會保持每??處鏈接文件的同步性,也就是說,不論改動了哪一處,其

他的文件都會發(fā)生相同的變化。

■In的鏈接分軟鏈接和硬鏈接兩種。

軟鏈接就是上面所說的In-s****,它只會在用戶選定的位置上生成一個文件的

鏡像,不會重復占用磁盤空間,平時使用較多的都是軟鏈接。

硬鏈接是不帶參數(shù)的In****,它會在用戶選定的位置上生成一個和源文件大小

相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。

P34表2.25Linux常見類型的文件解壓命令一覽表

文件后綴解壓命令示例

atarxvtarxvhello.a

.ZUncompressuncompresshello.Z

gzGuiizipgunziphello.gz

.tar.ZtarxvZftarxvZfhello.tar.Z

.tar.gz.tgztarxvzftarxvzfhello.tar.gz

tar.bz2tarjxvftarjxvfhello.tar.bz2

安裝:rpm-i安裝:rpm-ihello.rpm

rpm

解壓縮:rpm2qjio解壓縮:rpm2qpiohello.rpm

安裝:dpkg-i安裝:dpkg-ihello.deb

deb(Debain中的文件格

式)解壓縮:dpkg-deb-fs^-tarfile解壓縮:dpkg-deb-fs^-tarhello

hello,deb

.zipUnzipunaphello.zip

P62函數(shù)靜態(tài)庫和動態(tài)庫

在成功編譯之后,就進入了鏈接階段。這里涉及一個重要的概念:函數(shù)庫。

讀者可以重新查看這個小程序,在這個程序中并沒有定義“printf”的函數(shù)實

現(xiàn),且在預編譯中包含進的“stdio.h”中也只有該函數(shù)的聲明,而沒有定義函數(shù)的

實現(xiàn),那么,是在哪里實現(xiàn)"printf”函數(shù)的呢?最后的答案是:系統(tǒng)把這些函數(shù)

的實現(xiàn)都放到名為libc.so.6的庫文件中去了,在沒有特別指定時,gcc會到系統(tǒng)默

認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到libc.so.6函數(shù)庫中去,這樣就

能調用函數(shù)“printf”T,而這也正是鏈接的作用。

函數(shù)庫有靜態(tài)庫和動態(tài)庫兩種。鄢態(tài)庫是指編譯鏈接時,將庫文件的代碼全部加

入可執(zhí)行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后

綴名通常為“.a”。動態(tài)庫與之相反,在編譯鏈接時并沒有將庫文件的代碼加入可執(zhí)行

文件中,而是在程序執(zhí)行時加載庫,這樣可以節(jié)省系統(tǒng)的開銷。一般動態(tài)庫的后綴名

為“.so”,如前面所述的libc.so.6就是動態(tài)庫。gcc在編譯時默認使用動態(tài)庫。

完成了鏈接之后,gcc就可以生成可執(zhí)行文件,如下所示。

[root@localhostgcc]#gcchello.o-ohello

運行該可執(zhí)行文件,出現(xiàn)的正確結果如下。

(root@localhostgcc]#./hello

Hello!Thisisourembeddedworld!

P76makefile

3.5.2makefile變量

david:kang.oyul.o

gcckang.obar.o-omyprog

kang.o:kang.ckang.hhead.h

gcc-Wall-0-g-ckang.c-okang.o

yul.o:bar.chead.h

gcc-Wall-0-g-cyul.c-oyul.o

在這個makefile中有3個目標體(target)?分別為david、kang.o和yul.o,其中

第一個目標體的依賴文件就是后兩個目標體。如果用戶使用命令"makedavid",則

make管理器就是找到david目標體開始執(zhí)行。

這時、make會自動檢查相關文件的時間戳。首先,在檢查“kang.o"、“yul.o”和

“david”3個文件的時間戳之前,它會向下查找那些把“kang.o”或“yul.o”作為目標

文件的時間戳。比如,"kang.o”的依賴文件為“kang.c"、“kang.h"、“head.h"。如果

這些文件中任何一個的時間戳比“kang.o”新,則命令"gcc-Wall-0-g-ckang.c-o

kang.o”將會執(zhí)行,從而更新文件“kang.。"。在更新完“kang.。”或“yul.o”之后,

make會檢查最初的“kang.o"、"yul.o"和"david”3個文件,只要文件“kang.o”或

“yuL?!敝械闹辽儆幸粋€文件的時間戳比“david”新,則第二行命令就會被執(zhí)行。這

樣,make就完成了自動檢查時間戳的工作,開始執(zhí)行編譯工作。這也就是make工作

的基本流程。

接下來,為了進一步簡化編輯和維護makefile,make允許在makefile中創(chuàng)建和使

用變量。變量是在makefile中定義的名字,用來代替一個文本字符串,該文本字符串

稱為該變量的值。在具體要求下,這些值可以代替目標體、依賴文件、命令以及makefile

文件中其他部分。在makefile中的變量定義有兩種方式:一種是遞歸展開方式,另一

種是簡單方式。

遞歸展開方式定義的變量是在引用該變量時進行替換的,即如果該變量包含了

對其他變量的引用,則在引用該變量時一次性將內嵌的變量全部展開,雖然這種類

型的變量能夠很好地完成用戶的指令,但是它也有嚴重的缺點,如不能在變量后追

加內容(因為語句:CFLAGS=$(CFLAGS)-O在變量擴展過程中可能導致無窮循環(huán))。

為了避免上述問題,簡單擴展型變量的值在定義處展開,并且只展開一次,因此

它不包含任何對其他變量的引用,從而消除變量的嵌套引用。

遞歸展開方式的定義格式為:VAR=var。

簡單擴展方式的定義格式為:VAR:=var。

make中的變量使用均使用的格式為:$(VAR)?

變量名是不包括“:”、"鏟’、以及結尾空格的任何字符串.同時,變

量名中包含字母、數(shù)字以及下劃線以外的情況應盡量避免,因為它們可能在將

來被賦予特別的含義。

變量名是大小寫敏感的,例如變量名“foo”、“FOO”、和“Foo”代表不

同的變量.

推薦在makefile內部使用小寫字母作為變量名,預留大寫字母作為控制隱含規(guī)

則參數(shù)或用戶重載命令選項參數(shù)的變量名。

下面給出了上例中用變量替換修改后的makefile,這里用OBJS代替kang.o和

yul.o,用CC代替gcc,用CFLAGS代替“-Wall-0-g”。這樣在以后修改時,就可以

只修改變量定義,而不需要修改下面的定義實體,從而大大簡化了makefile維護的工作量。

經變量替換后的makefile如下所示:

OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-0-g

david:$(OBJS)

$(CC)$(OBJS)-odavid

kang.o:kang.ckang.h

$(CC)$(CFLAGS)-ckang.c-okang.o

yul.o:yul.cyul.h

$(CC)$(CFLAGS)-cyul.c-oyul.o

可以看到,此處變量是以遞歸展開方式定義的。

makefile中的變量分為用戶自定義變量、預定義變量、自動變量及環(huán)境變量。如

上例中的OBJS就是用戶自定義變量,自定義變量的值由用戶自行設定,而預定義變

量和自動變量為通常在makefile都會出現(xiàn)的變量,它們的一部分有默認值,也就是常

見的設定值,當然用戶可以對其進行修改。

預定義變量包含了常見編譯器、匯編器的名稱及其編譯選項。表3.15列出了

makefile中常見預定義變量及其部分默認值。

表3.15makefile中常見的預定義變量

預定義變量含義

AR\庫文件維護程序的名稱,默認值為ar

AS匯編程序的名稱,默認值為as

CCC編譯器的名稱,默認值為cc

CPPC預編譯器的名稱,默認值為$((:0-£

CXXC1編譯器的名稱,默認值為g++

FCFortran編譯器的名稱,默認值為

RM文件刪除程序的名稱,默認值為rm-f

ARFLAGS庫文件維護程序的選項,無默認值

ASFLAGS匯編程序的選項,無默認值

CFLAGSC編譯器的選項,無默認值

CPPFLAGSC預編譯的選項,無默認值

CXXFLAGSC++編譯器的選項,無默認值

FFLAGSFortran編譯器的選項,無默認值

可以看出,上例中的CC和CFLAGS是預定義變量,其中由于CC沒有采用默認

值,因此,需要把“CC=gcc”明確列出來。

由于常見的gcc編譯語句中通常包含了目標文件和依賴文件,而這些文件在

makefile文件中目標體所在行已經有所體現(xiàn),因此,為了進一步簡化makefile的編寫,

就引入了自動變量。自動變量通??梢源砭幾g語句中出現(xiàn)目標文件和依賴文件等,

并且具有本地含義(即下一語句中出現(xiàn)的相同變量代表的是下一語句的目標文件和依

賴文件)。表3.16列出了makefile中常見的自動變量。

自動變量含義

S*不包含擴展名的目標文件名稱

所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復的依

$+

賴文件

$<第一個依賴文件的名稱

$?所有時間戳比目標文件晚的依賴文件,并以空格分開

s@目標文件的完整名稱

$A所有不重且的依賴文件,以空格分開

5%如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱

自動變量的書寫比較難記,但是在熟練了之后使用會非常方便,請讀者結合下例

中的自動變量改寫的makefile進行記憶。

OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-0-g

david:$(OBJS)

$(CC)$A-o$@

kang.o:kang.ckang.h

$(CC)$(CFLAGS)-c$<-o$@

yul.o:yul.cyul.h

$(CC)$(CFLAGS)-c$<-o$@

另外,在makefile中還可以使用環(huán)境變量。使用環(huán)境變量的方法相對比較簡單,

make在啟動時會自動讀取系統(tǒng)當前已經定義了的環(huán)境變量,并且會創(chuàng)建與之具有相

同名稱和數(shù)值的變量。但是,如果用戶在makefile中定義了相同名稱的變量,那么用

戶自定義變量將會覆蓋同名的環(huán)境變量。

3.5.3makefile規(guī)則

makefile的規(guī)則是make進行處理的依據(jù),它包括了目標體、依賴文件及其之間的命

令語句。在上面的例子中,都顯式地指出了makefile中的規(guī)則關系,如“$(CC)$(CFLAGS)

-c$<-o$@w,但為了簡化makefile的編寫,make還定義了隱式規(guī)則和模式規(guī)則,下面就

分別對其進行講解。

1.隱式規(guī)則

隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的規(guī)則完成任務,這樣,當用戶使用它們

時就不必詳細指定編譯的具體細節(jié),而只需把目標文件列出即可。make會自動搜索

隱式規(guī)則目錄來確定如何生成目標文件。如上例就可以寫成:

OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-0-g

david:$(OBJS)

$(CC)$A-o$@

為什么可以省略后兩句呢?因為make的隱式規(guī)則指出:所有“.o”文件都可自

動由“.c”文件使用命令“$(CC)$(CPPFLAGS)$(CFLAGS)-cEle.c-ofile.o"來生成。

這樣“kang.o”和“yul.o”就會分別通過調用<($(CC)$(CFLAGS)-ckang.c-okang.oM

和“$(CC)$(CFLAGS)-cyul.c-oyul.o”來生成。

在隱式規(guī)則只能查找到相同文件名的不同后緩名文件,如“kang.o”文件必須

由"kang.c"文件生成。

表3.17給出了常見的隱式規(guī)則目錄。

對應語言后綴名隱式規(guī)則

C編譯:<變?yōu)?0$(CC)-c$(CPPFLAGS)S(CFLAGS)

C++編譯:.cc或.C變?yōu)?0$(CXX)yS(CPPFLAGS)$(CXXFLAGS)

Pascal編譯:.p變?yōu)?o$(PC)y$(PFLAGS)

Fortran編譯:.1?變?yōu)?o$(FC)<$(FFLAGS)

2.模式規(guī)則

模式規(guī)則是用來定義相同處理規(guī)則的多個文件的。它不同于隱式規(guī)則,隱式規(guī)則

僅僅能夠用make默認的變量來進行操作,而模式規(guī)則還能引入用戶自定義變量,為

多個文件建立相同的規(guī)則,從而簡化makefile的編寫。

模式規(guī)則的格式類似于普通規(guī)則,這個規(guī)則中的相關文件前必須用“%”標明。

使用模式規(guī)則修改后的makefile的編寫如下:

OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-0-g

david:$(OBJS)

$(CC)$A-o$@

%.o:%.c

$(CC)$(CFLAGS)-c$<-o$@

3.5.4make管理器的使用

使用make管理器非常簡單,只需在make命令的后面鍵入目標名即可建立指定的

目標,如果直接運行make,則建立makefile中的第一個目標。

此外make還有豐富的命令行選項,可以完成各種不同的功能。

表3.18列出了常用的make命令行選項。

命令格式含義

-Cdir讀入指定目錄下的makefile

-ffile讀入當前目錄下的file文件作為makefile

-I忽略所有的命令執(zhí)行錯誤

-Idir指定被包含的makMle所在目錄

-n只打印要執(zhí)行的命令,但不執(zhí)行這些命令

-P顯示make變量數(shù)據(jù)庫和隱含規(guī)則

-s在執(zhí)行命令時不顯示命令

-w如果make在執(zhí)行過程中改變目錄,則打印當前目錄名

P133NFS文件系統(tǒng)

NFS為NetworkFileSystem的簡稱,最早是由Sun公司提出發(fā)展起來的,其目的

就是讓不同的機器、不同的操作系統(tǒng)之間通過網(wǎng)絡可以彼此共享文件。NFS可以讓不

同的主機通過網(wǎng)絡將遠端的NFS服務器共享出來的文件安裝到自己的系統(tǒng)中,從客戶

端看來,使用NFS的遠端文件就像是使用本地文件一樣。在嵌入式中使用NFS會使

應用程序的開發(fā)變得十分方便,并且不用反復地燒寫映像文件。

NFS的使用分為服務端和客戶端,其中服務端是提供要共享的文件,而客

戶端則通過掛載(“mount")這一動作來實現(xiàn)對共享文件的訪問操作。下面主要

介紹NFS服務端的使用。在嵌入式開發(fā)中,通常NFS服務端在宿主機上運行,

而客戶端在目標板上運行。

NFS服務端是通過讀入它的配置文件“/etc/exports”來決定所共享的文件目錄的。

下面首先講解這個配置文件的書寫規(guī)范。

在這個配置文件中,每一行都代表一項要共享的文件目錄以及所指定的客戶端對

它的操作權限??蛻舳丝梢愿鶕?jù)相應的權限,對該目錄下的所有目錄文件進行訪問。

配置文件中每一行的格式如下:

[共享的目錄][客戶端主機名稱或[P][參數(shù)1,參數(shù)2…]

在這里,主機名或IP是可供共享的客戶端主機名或IP,若對所有的IP都可以訪

問,則可用“*”表示。這里的參數(shù)有很多種組合方式,常見的參數(shù)如表5.1所示。

選項參數(shù)含義

rw可讀寫的權限

ro只讀的權限

NFS客戶端分享目錄使用者的權限,即如果客戶端使用的是root用戶,那么對于

no__root_$qua$h

這個共享的目錄而言,該客戶端就具有root的權限

sync資料同步寫入到內存與硬盤當中

async資料會先暫存于內存當中,而非直接寫入硬盤

如在本例中,配置文件"/etc/exports”的代碼如下:

(root@localhostfs]#cat/etc/exports

/root/workplace192.168.1.*(rw,no_root_squash)

在設定完配置文件之后,需要啟動nfs服務和portmap服務,這里的portm叩服

務是允許NFS客戶端查看NFS服務在用的端口,在它被激活之后,就會出現(xiàn)一個端

口號為111的sunRPC(遠端過程調用)的服務。這是NFS服務中必須實現(xiàn)的一項,

因此,也必須把它開啟。如下所示:

[root0localhostfs]#serviceportmapstart

啟動portmap:[確定]

(rootQlocalhostfs]#servicenfsstart

啟動NFS服務:[確定]

關掉NFS配額:[確定]

啟動NFS守護進程:[確定]

啟動NFSmountd:[確定)

可以看到,在啟動NFS服務的時候啟動了mountd進程。這是NFS掛載服務,用

于處理NFS遞交過來的客戶端請求。另外還會激活至少兩個以上的系統(tǒng)守護進程,然

后就開始監(jiān)聽客戶端的請求,用"cat/var/log/messages"命令可以查看操作是否成功。

這樣,就啟動了NFS的服務,另外還有兩個命令,可以便于使用NFS。

其中一個是exportfs,它可以重新掃描“/etc/exports”,使用戶在修改了“/etc/exports”

配置文件之后不需要每次重啟NFS服務。其格式為:

exportfs[選項]

exportfs的常見選項如表5.2所示。

選項參數(shù)含義

-a全部掛載(或卸載)/etc/exports中的設定文件目錄

-r重新掛載/etc,exports中的設定文件目錄

-u卸載某一目錄

-V在export的時候,將共享的目錄顯示到屏晶上

另外一個是showmount命令,它用于當前的掛載情況。其格式為:

showmount[選項]hostname

showmount的常見選項如表5.3所示。

選項參數(shù)含義

-a在屏辭上顯示目前主機與客戶端所連上來的使用目錄狀態(tài)

-e顯示hostname中/etcexports里設定的共享目錄

P154:open。、read。、write。、lseek()和close。

6.3.1基本文件操作

(1)函數(shù)說明。

open。函數(shù)用于打開或創(chuàng)建文件,在打開或創(chuàng)建文件時可以指定文件的屬性及用

戶的權限等各種參數(shù)。

close。函數(shù)用于關閉一個被打開的文件。當一個進程終止時,所有被它打開的文

件都由內核自動關閉,很多程序都使用這一功能而不顯示地關閉一個文件。

read。函數(shù)用于將從指定的文件描述符中讀出的數(shù)據(jù)放到緩存區(qū)中,并返回實際

讀入的字節(jié)數(shù)。若返回0,則表示沒有數(shù)據(jù)可讀,即已達到文件尾。讀操作從文件的

當前指針位置開始。當從終端設備文件中讀出數(shù)據(jù)時,通常一次最多讀一行。

write。函數(shù)用于向打開的文件寫數(shù)據(jù),寫操作從文件的當前指針位置開始。對磁

盤文件進行寫操作,若磁盤已滿或超出該文件的長度,則write。函數(shù)返回失敗。

lseek()函數(shù)用于在指定的文件描述符中將文件指針定位到相應的位置。它只能用

在可定位(可隨機訪問)文件操作中。管道、套接字和大部分字符設備文件是不可定

位的,所以在這些文件的操作中無法使用lseek()調用。

(2)函數(shù)格式。

open。函數(shù)的語法格式如表6.1所示。

前nchide<sys/type$.h>/*提供類型pid_【的定義*/

所需頭文件芹include<sys/stat.h>

存include

函數(shù)原型intopen(constchar"pathname,intflags,intperms)

pathname被打開的文件名(可包括路竹名予

O_RDONLY:以*讀方有打胭件

O_WRONLY:以代寫方式打開文件

O_RDWR:以讀寫方樂打開文件

O_CREAT:如果該文件不存在,就創(chuàng)建一個新的文件,并用第

三個參數(shù)為其設置權限

O_EXCL:如果使用O_CREAT時文件存在,則可返回錯誤消息。

flag:文件打開這一參數(shù)可測試文件息否存在.此時open是原子操作,防止多

的方式“弋進程同時創(chuàng)建同一個文件

0_N0CE:使用本參數(shù)時,若文件為終端,那么該終端不會

函數(shù)傳入值成為調用open。的那個進程的控制終端

O_TRUNC:若文件已經存在,那么會刪除文件中的全部原有數(shù)

據(jù),并且設置文件大小為0。

O_APPEND:以添加方式打開文件,在打開文件的同時,文件

指針指向文件的末尾,即將寫入的數(shù)據(jù)添加到文件的末尾

被打開文件的存取權限

可以用一組宏定義:S_I(RWX)(USRGRPOTH)

其中RWX分別表示讀號/執(zhí)行權限

perms

USRGRPOTH分別表示文件所有者/文件所屬組/其他用戶

例如,SJRUSRS_IWUSR表示設置文件所有者的可讀可寫屬

性.八加制

溫馨提示

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

評論

0/150

提交評論