前三個(gè)和最后一個(gè)是兩個(gè)類型。前三個(gè)主要是Linux用來創(chuàng)建新的進(jìn)程(線程)而設(shè)計(jì)的,exec()系列函數(shù)則是用來用指定的程序替換當(dāng)前進(jìn)程的所有內(nèi)容。所以exec()系列函數(shù)經(jīng)常在前三個(gè)函數(shù)使用之后調(diào)用,來創(chuàng)建一個(gè)全新的程序運(yùn)行環(huán)境。Linux用init進(jìn)程啟動(dòng)其他進(jìn)程的過程一般都是這樣的。
10年積累的成都網(wǎng)站制作、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有鹽津免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
下面說fork、vfork和clone三個(gè)函數(shù)。這三個(gè)函數(shù)分別調(diào)用了sys_fork、sys_vfork、sys_clone,最終都調(diào)用了do_fork函數(shù),差別在于參數(shù)的傳遞和一些基本的準(zhǔn)備工作不同。可見這三者最終達(dá)到的最本質(zhì)的目的都是創(chuàng)建一個(gè)新的進(jìn)程。在這里需要明確一下,Linux內(nèi)核中沒有獨(dú)立的“線程”結(jié)構(gòu),Linux的線程就是輕量級(jí)進(jìn)程,換言之基本控制結(jié)構(gòu)和Linux的進(jìn)程是一樣的(都是通過struct task_struct管理)。
fork是最簡(jiǎn)單的調(diào)用,不需要任何參數(shù),僅僅是在創(chuàng)建一個(gè)子進(jìn)程并為其創(chuàng)建一個(gè)獨(dú)立于父進(jìn)程的空間。fork使用COW(寫時(shí)拷貝)機(jī)制,并且COW了父進(jìn)程的??臻g。
vfork是一個(gè)過時(shí)的應(yīng)用,vfork也是創(chuàng)建一個(gè)子進(jìn)程,但是子進(jìn)程共享父進(jìn)程的空間。在vfork創(chuàng)建子進(jìn)程之后,父進(jìn)程阻塞,直到子進(jìn)程執(zhí)行了exec()或者exit()。vfork最初是因?yàn)閒ork沒有實(shí)現(xiàn)COW機(jī)制,而很多情況下fork之后會(huì)緊接著exec,而exec的執(zhí)行相當(dāng)于之前fork復(fù)制的空間全部變成了無用功,所以設(shè)計(jì)了vfork。而現(xiàn)在fork使用了COW機(jī)制,唯一的代價(jià)僅僅是復(fù)制父進(jìn)程頁(yè)表的代價(jià),所以vfork不應(yīng)該出現(xiàn)在新的代碼之中。在Linux的manpage中隊(duì)vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux為創(chuàng)建線程設(shè)計(jì)的(雖然也可以用clone創(chuàng)建進(jìn)程)。所以可以說clone是fork的升級(jí)版本,不僅可以創(chuàng)建進(jìn)程或者線程,還可以指定創(chuàng)建新的命名空間(namespace)、有選擇的繼承父進(jìn)程的內(nèi)存、甚至可以將創(chuàng)建出來的進(jìn)程變成父進(jìn)程的兄弟進(jìn)程等等。clone和fork的調(diào)用方式也很不相同,clone調(diào)用需要傳入一個(gè)函數(shù),該函數(shù)在子進(jìn)程中執(zhí)行。此外,clone和fork最大不同在于clone不再?gòu)?fù)制父進(jìn)程的??臻g,而是自己創(chuàng)建一個(gè)新的。
關(guān)于Linux命令的介紹,看看《linux就該這么學(xué)》,具體關(guān)于這一章地址3w(dot)linuxprobe/chapter-02(dot)html
Linux命令具有以下特點(diǎn):
簡(jiǎn)潔明了:Linux命令行界面的語(yǔ)法簡(jiǎn)單明了,容易理解和使用。
功能強(qiáng)大:Linux命令具有高度的靈活性和可擴(kuò)展性,可以完成大多數(shù)日常任務(wù)。
自動(dòng)化: Linux命令可以使用腳本語(yǔ)言自動(dòng)化任務(wù),提高工作效率。
網(wǎng)絡(luò)支持: Linux命令可以在網(wǎng)絡(luò)環(huán)境下運(yùn)行,方便遠(yuǎn)程管理。
開源性: Linux是開源的,命令的源代碼可以免費(fèi)獲取和修改。
Linux之間的工具必須要能夠協(xié)同工作,一起完成很多不曾設(shè)計(jì)過的功能,而不能和windows中的程序一樣各自為戰(zhàn),這就要求必須有一個(gè)工具來協(xié)同各個(gè)程序,這個(gè)工具就是文本流,所以linux很多異常強(qiáng)大的工具都是基于文本模式的,而文本模式也就成了linux的核心。例如你用圖形界面作一些修改,其實(shí)都是背后的指令在工作,例如你設(shè)置屏幕分辨率,其實(shí)是圖形界面把你的操作寫入了/etc/X11/xorg.conf文件,你完全可以手工實(shí)現(xiàn)。于是linux很多程序核心都是文本模式,然后為了方便一些人加一個(gè)圖形界面的外殼。但是不要為了命令而命令,順手的才是最好的,畢竟是人操作機(jī)器,而不是機(jī)器操作人^-^
1.列出文件清單命令:ls
ls命令能夠列出當(dāng)前目錄下的所有內(nèi)容。ls 命令的執(zhí)行方式為:
# ls [-選項(xiàng)] [文件名或者目錄名]
進(jìn)入到Linux命令行中后,我們至少要知道當(dāng)前所處的位置有哪些內(nèi)容,這些信息就可以使用ls命令來獲得。
在Linux中,ls命令是最常使用的命令之一,因?yàn)樵诿钚邢乱S時(shí)查看目錄內(nèi)容。如果不加任何選項(xiàng)的話,ls命令僅列出當(dāng)前目錄下的文件和目錄名,例如,想要查看/etc目錄下的內(nèi)容,可以使用下列命令:
# ls /etc
如果想要列出當(dāng)前目錄下所有文件,則可以使用下列命令:
# ls -a
2、cat命令
功能:在標(biāo)準(zhǔn)輸出上顯示文件。
語(yǔ)法:cat [-vTEuAte] 文件
例子: cat example.txt
cat -A exam2.txt
cat file1 file2 file2
3、more命令
功能:在終端屏幕按屏顯示文本文件。
語(yǔ)法: more [-pcdls] 文件
例子: more example.c
more -dc example.c
more -c -10 example.c
4、less命令
less命令的功能幾乎和more命令一樣,也是用來按頁(yè)顯示文件,不同之處在于less命令在顯示文件時(shí)允許用戶既
可以向前又可以向后翻閱文件。
5、head命令
功能:顯示指定文件的前若干行。缺省設(shè)置為顯示10行
語(yǔ)法:head [-n] 文件
例子: head example.c
head -3 example.c
6、tail命令
功能:顯示指定文件的末尾若干行。缺省設(shè)置為顯示10行
語(yǔ)法:tail [+ / - num ] [參數(shù)] 文件
+num 從第num行以后開始顯示。- num 從距文件尾num行處開始顯示。
例子: tail example.c
tail -4 example.c
7、grep、fgrep和egrep命令
功能:
這組命令以指定模式搜索文件,并通知用戶在什么文件中搜索到與指定的模式匹配的字符串,并打印出所有包含該字符串的文本行,在該文本行的最前面是該行所在的文件名。grep命令一次只能搜索一個(gè)指定的模式;egrep命令檢索擴(kuò)展的正則表達(dá)式(包括表達(dá)式組和可選項(xiàng));fgrep命令檢索固定字符串,它不識(shí)別正則表達(dá)式,是快速搜索命令。
語(yǔ)法:
grep [-EFbcihlnvxef] [查找模式] [文件名1,文件名2,……]
egrep [選項(xiàng)] [查找模式] [文件名1,文件名2,……]
fgrep [選項(xiàng)] [查找模式] [文件名1,文件名2,……]
例子: grep "text file" example
grep data *
grep goto *.c