新聞中心
Linux內(nèi)核中的Linux進(jìn)程是如何創(chuàng)建的?
前三個(gè)和最后一個(gè)是兩個(gè)類(lèi)型。前三個(gè)主要是Linux用來(lái)創(chuàng)建新的進(jìn)程(線(xiàn)程)而設(shè)計(jì)的,exec()系列函數(shù)則是用來(lái)用指定的程序替換當(dāng)前進(jìn)程的所有內(nèi)容。所以exec()系列函數(shù)經(jīng)常在前三個(gè)函數(shù)使用之后調(diào)用,來(lái)創(chuàng)建一個(gè)全新的程序運(yùn)行環(huán)境。Linux用init進(jìn)程啟動(dòng)其他進(jìn)程的過(guò)程一般都是這樣的。
創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計(jì)、成都品牌網(wǎng)站建設(shè)、成都全網(wǎng)營(yíng)銷(xiāo)推廣。我們專(zhuān)注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶(hù)提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶(hù),為客戶(hù)提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。
下面說(shuō)fork、vfork和clone三個(gè)函數(shù)。這三個(gè)函數(shù)分別調(diào)用了sys_fork、sys_vfork、sys_clone,最終都調(diào)用了do_fork函數(shù),差別在于參數(shù)的傳遞和一些基本的準(zhǔn)備工作不同??梢?jiàn)這三者最終達(dá)到的最本質(zhì)的目的都是創(chuàng)建一個(gè)新的進(jìn)程。在這里需要明確一下,Linux內(nèi)核中沒(méi)有獨(dú)立的“線(xiàn)程”結(jié)構(gòu),Linux的線(xiàn)程就是輕量級(jí)進(jìn)程,換言之基本控制結(jié)構(gòu)和Linux的進(jìn)程是一樣的(都是通過(guò)struct task_struct管理)。
fork是最簡(jiǎn)單的調(diào)用,不需要任何參數(shù),僅僅是在創(chuàng)建一個(gè)子進(jìn)程并為其創(chuàng)建一個(gè)獨(dú)立于父進(jìn)程的空間。fork使用COW(寫(xiě)時(shí)拷貝)機(jī)制,并且COW了父進(jìn)程的??臻g。
vfork是一個(gè)過(guò)時(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沒(méi)有實(shí)現(xiàn)COW機(jī)制,而很多情況下fork之后會(huì)緊接著exec,而exec的執(zhí)行相當(dāng)于之前fork復(fù)制的空間全部變成了無(wú)用功,所以設(shè)計(jì)了vfork。而現(xiàn)在fork使用了COW機(jī)制,唯一的代價(jià)僅僅是復(fù)制父進(jìn)程頁(yè)表的代價(jià),所以vfork不應(yīng)該出現(xiàn)在新的代碼之中。在Linux的manpage中隊(duì)vfork有這樣一段話(huà):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)建線(xiàn)程設(shè)計(jì)的(雖然也可以用clone創(chuàng)建進(jìn)程)。所以可以說(shuō)clone是fork的升級(jí)版本,不僅可以創(chuàng)建進(jìn)程或者線(xiàn)程,還可以指定創(chuàng)建新的命名空間(namespace)、有選擇的繼承父進(jìn)程的內(nèi)存、甚至可以將創(chuàng)建出來(lái)的進(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父進(jìn)程創(chuàng)建兩個(gè)子進(jìn)程
#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h頭文件中
#include"unistd.h"
int main(void)
{
pid_t pid1,pid2;
pid1=fork();
switch(pid1)
{
case 0: //進(jìn)程創(chuàng)建成功,返回值為0
printf("b"); //子進(jìn)程1創(chuàng)建成功,輸出b
break;
case -1:
printf("Process creation failed\n");//子進(jìn)程創(chuàng)建失敗,輸出錯(cuò)誤信息
break;
default:
printf("a");//此時(shí)執(zhí)行父進(jìn)程,輸出a
sleep(1);
exit(0);
break;
}
pid2=fork();
switch(pid2)
{
case 0: //進(jìn)程創(chuàng)建成功,返回值為0
printf("c"); //子進(jìn)程2創(chuàng)建成功,輸出c
break;
case -1:
printf("Process creation failed\n");//子進(jìn)程創(chuàng)建失敗,輸出錯(cuò)誤信息
exit(0);
break;
default:
printf("a");//此時(shí)執(zhí)行父進(jìn)程,輸出a
//sleep(1);
exit(0);
break;
}
exit(0);
}
linux創(chuàng)建新進(jìn)程時(shí),PCB存放何處?其內(nèi)存如何分配
被調(diào)用時(shí),pcb由外存儲(chǔ)器轉(zhuǎn)內(nèi)主存,pcb是存儲(chǔ)器上的一組數(shù)據(jù)結(jié)構(gòu),需要的資源都分配在pcb上。
子進(jìn)程(對(duì)應(yīng)pid==0語(yǔ)句)調(diào)bai用pthread接口創(chuàng)建線(xiàn)程,在縣城內(nèi)將value賦值5,然后打印 CHILD: value=%d\n 此時(shí)duvalue = 5
父進(jìn)程 (對(duì)應(yīng) pid 0 語(yǔ)句),等待子進(jìn)程執(zhí)行完成后(wait語(yǔ)句),打印PARENT: value=%d\n ,此時(shí)value =0。
擴(kuò)展資料:
通過(guò)修改Linux系統(tǒng)內(nèi)核參數(shù)ip_forward的方式實(shí)現(xiàn)路由功能,系統(tǒng)使用sysctl命令配置與顯示在/proc/sys目錄中的內(nèi)核參數(shù)。首先在命令行輸入:cat/proc/sys/net/ipv4/ip_forwad,檢查L(zhǎng)inux內(nèi)核是不是開(kāi)啟IP轉(zhuǎn)發(fā)功能。
如果結(jié)果為1,表明路由轉(zhuǎn)發(fā)功能已經(jīng)開(kāi)啟;如果結(jié)果為0,表明沒(méi)有開(kāi)啟。出于安全考慮,Linux內(nèi)核默認(rèn)是禁止數(shù)據(jù)包路由轉(zhuǎn)發(fā)的。在linux系統(tǒng)中,有臨時(shí)和永久兩種方法啟用轉(zhuǎn)發(fā)功能。
參考資料來(lái)源:百度百科-linux命令
當(dāng)前文章:Linux創(chuàng)建子進(jìn)程命令,Linux創(chuàng)建子進(jìn)程
轉(zhuǎn)載來(lái)于:http://fisionsoft.com.cn/article/hdjcse.html