新聞中心
在Linux系統(tǒng)中,進(jìn)程是系統(tǒng)中最為基礎(chǔ)和重要的概念之一。進(jìn)程是計(jì)算機(jī)中運(yùn)行的程序?qū)嵗鼡碛凶约旱倪M(jìn)程ID(PID)、獨(dú)立的地址空間、優(yōu)先級(jí)以及大量系統(tǒng)資源。在Linux中,每個(gè)進(jìn)程都有自己的父進(jìn)程和子進(jìn)程,它們之間通過進(jìn)程ID和進(jìn)程關(guān)系來進(jìn)行聯(lián)系和協(xié)調(diào)。本文將,包括概念、創(chuàng)建機(jī)制、作用和實(shí)例分析等方面展開講解,以期加深讀者對(duì)Linux進(jìn)程管理機(jī)制的認(rèn)識(shí)和理解。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比伊川網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式伊川網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋伊川地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
一、父子進(jìn)程的概念
父子進(jìn)程的關(guān)系是指一個(gè)進(jìn)程可以通過創(chuàng)建子進(jìn)程的方式生成新的進(jìn)程,被生成的進(jìn)程即為子進(jìn)程,生成新進(jìn)程的進(jìn)程即為父進(jìn)程。在Linux中,所有的進(jìn)程都有一個(gè)PID,父進(jìn)程的PID可以通過getppid()函數(shù)來獲取。而子進(jìn)程的PID則是從父進(jìn)程中fork()系統(tǒng)調(diào)用返回的值獲取。父子進(jìn)程之間共享了一部分資源,如文件描述符、共享內(nèi)存、套接字等,但是子進(jìn)程有自己的獨(dú)立地址空間和自己的特有資源。
二、父子進(jìn)程的創(chuàng)建機(jī)制
在Linux系統(tǒng)中,父子進(jìn)程的創(chuàng)建是通過fork()系統(tǒng)調(diào)用來實(shí)現(xiàn)的。fork()系統(tǒng)調(diào)用會(huì)將當(dāng)前進(jìn)程復(fù)制一份,生成一個(gè)新的進(jìn)程,這個(gè)新的進(jìn)程即為子進(jìn)程,它會(huì)繼承父進(jìn)程中的大部分屬性和狀態(tài)信息。復(fù)制的過程稱為“fork(分支)”,因?yàn)樯傻倪@個(gè)進(jìn)程,從它的父進(jìn)程中得到了無數(shù)的屬性信息和狀態(tài)信息。
fork()系統(tǒng)調(diào)用的格式如下:
pid_t fork(void);
該函數(shù)返回值為子進(jìn)程的PID,返回值為0表示當(dāng)前正在運(yùn)行的進(jìn)程是子進(jìn)程。如果fork()系統(tǒng)調(diào)用失敗,則返回-1。
三、父子進(jìn)程的作用
父子進(jìn)程的關(guān)系在Linux中具有廣泛的應(yīng)用,主要體現(xiàn)在以下幾個(gè)方面:
1. 創(chuàng)建守護(hù)進(jìn)程:父進(jìn)程創(chuàng)建子進(jìn)程,而子進(jìn)程通常會(huì)成為守護(hù)進(jìn)程。守護(hù)進(jìn)程是一種后臺(tái)運(yùn)行的進(jìn)程,它沒有控制終端,獨(dú)立于用戶登錄會(huì)話,其作用是完成一些與系統(tǒng)運(yùn)行相關(guān)的任務(wù),如系統(tǒng)日志記錄、網(wǎng)絡(luò)服務(wù)等。
2. 實(shí)現(xiàn)并行計(jì)算:父子進(jìn)程可以并行運(yùn)行,它們之間相互獨(dú)立,可以同時(shí)執(zhí)行不同的任務(wù),從而有效提升系統(tǒng)的運(yùn)行效率。
3. 實(shí)現(xiàn)進(jìn)程通信:父進(jìn)程和子進(jìn)程之間可以通過管道、共享內(nèi)存、消息隊(duì)列等機(jī)制進(jìn)行通信和協(xié)作。
4. 進(jìn)程資源限制:在Linux中,對(duì)于一些需要限制資源的程序,可以通過生成子進(jìn)程的方式實(shí)現(xiàn)資源限制。例如,可以通過setrlimit()系統(tǒng)調(diào)用設(shè)置CPU時(shí)間限制,使進(jìn)程在運(yùn)行超過限定時(shí)間后被強(qiáng)制終止。
四、父子進(jìn)程的實(shí)例分析
為深入理解父子進(jìn)程的關(guān)系,下面通過一個(gè)實(shí)例進(jìn)行分析。
源碼如下:
“`
#include
#include
#include
int mn(int argc, char *argv[]) {
pid_t pid;
pid = fork(); // 創(chuàng)建子進(jìn)程
if (pid
perror(“fork error”);
exit(1);
} else if (pid == 0) { // 子進(jìn)程
printf(“I am the child process, my process ID is %d\n”, getpid());
} else { // 父進(jìn)程
printf(“I am the parent process, my process ID is %d, my child process ID is %d\n”, getpid(), pid);
}
return 0;
}
“`
該程序通過fork()系統(tǒng)調(diào)用生成一個(gè)新的進(jìn)程,子進(jìn)程中輸出自己的PID,父進(jìn)程中輸出自己的PID以及子進(jìn)程的PID。運(yùn)行結(jié)果如下:
“`
I am the parent process, my process ID is 998, my child process ID is 999
I am the child process, my process ID is 999
“`
從運(yùn)行結(jié)果可以看出,父進(jìn)程首先輸出了自己的PID和子進(jìn)程的PID,然后子進(jìn)程輸出了自己的PID。這說明父子進(jìn)程之間成功建立了聯(lián)系,共同完成了任務(wù)。
五、
相關(guān)問題拓展閱讀:
- linux系統(tǒng)的進(jìn)程間通信有哪幾種方式
- linux pipe();父進(jìn)程需要close(fd[0]);子進(jìn)程close(fd[1]);為什么都需要關(guān)閉一個(gè)?
linux系統(tǒng)的進(jìn)程間通信有哪幾種方式
一、方式
1、管道(Pipe)及有名管道( mkpipe):
管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信;
2、信號(hào)(Signal):
信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身。
linux除了支持Unix早期信號(hào)語義函數(shù)sigal外,還支持語義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction。
實(shí)際上,該函數(shù)是基于BSD的,BSD為了實(shí)現(xiàn)可靠信號(hào)機(jī)制,又能夠統(tǒng)一對(duì)外接口,用sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù)。
3、消息隊(duì)列(Message):
消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
4、共享內(nèi)存:
使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往往與其它通信機(jī)制,如信號(hào)量結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥。
5、信號(hào)量(semaphore):
主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
6、套接口(Socket):
更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
二、概念
進(jìn)程間通信概念:
IPC—-InterProcess Communication
每個(gè)進(jìn)程各自有不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到所以進(jìn)程之間要交換數(shù)據(jù)必須通過內(nèi)核。
在內(nèi)核中開辟一塊緩沖區(qū),進(jìn)程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進(jìn)程2再?gòu)膬?nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信。
擴(kuò)展資料
1)無名管道:
管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng);需要雙方通信時(shí),需要建立起兩個(gè)管道;只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程)。
管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),構(gòu)成兩進(jìn)程間通信的一個(gè)媒介。
數(shù)據(jù)的讀出和寫入:一個(gè)進(jìn)程向管道中寫的內(nèi)容被管道另一端的進(jìn)程讀出。寫入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。
2)有名管道:
不同于管道之處在于它提供一個(gè)路徑名與之關(guān)聯(lián),以FIFO的文件形式存在于文件系統(tǒng)中。這樣,即使與FIFO的創(chuàng)建進(jìn)程不存在親緣關(guān)系的進(jìn)程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進(jìn)程以及FIFO的創(chuàng)建進(jìn)程之間)。
因此,通過FIFO不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。值得注意的是,F(xiàn)IFO嚴(yán)格遵循先進(jìn)先出(first in first out),對(duì)管道及FIFO的讀總是從開始處返回?cái)?shù)據(jù),對(duì)它們的寫則把數(shù)據(jù)添加到末尾。它們不支持諸如lseek()等文件定位操作。
# 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
# 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。
# 信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
# 消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
# 信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
# 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
# 套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。
管道
消息隊(duì)列
unix domain socket
共享內(nèi)存
信號(hào)量
進(jìn)程間通信(IPC,Interprocess
communication)是一組編程接口,讓程序員能夠協(xié)調(diào)不同的進(jìn)程,使之能在一個(gè)操作系統(tǒng)里同時(shí)運(yùn)行,并相互傳遞、交換信息。這使得一個(gè)程序能夠在同一時(shí)間里處理許多用戶的要求。因?yàn)榧词怪挥幸粋€(gè)用戶發(fā)出要求,也可能導(dǎo)致一個(gè)操作系統(tǒng)中多個(gè)進(jìn)程的運(yùn)行,進(jìn)程之間必須互相通話。IPC接口就提供了這種可能性。每個(gè)IPC方法均有它自己的優(yōu)點(diǎn)和局限性,一般,對(duì)于單個(gè)程序而言使用所有的IPC方法是不常見的。
1、無名管道通信
無名管道(pipe):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用,進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
2、高級(jí)管道通信
高級(jí)管道(popen):將另一個(gè)程序當(dāng)做一個(gè)新的進(jìn)程在當(dāng)前程序進(jìn)程中啟動(dòng),則它算是當(dāng)前程序的子進(jìn)程,這種方式我們稱為高級(jí)管道方式。
3、有名管道通信
有名管道(named pipe):有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。
4、消息隊(duì)列通信
消息隊(duì)列(message
queue):消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí),消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
5、信號(hào)量通信
信號(hào)量(semophore):信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問,它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
6、信號(hào)
信號(hào)(sinal):信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
7、共享內(nèi)存通信
共享內(nèi)存(shared
memory):共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的IPC方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
8、套接字通信
套接字(socket):套接字也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信。
linux pipe();父進(jìn)程需要close(fd[0]);子進(jìn)程close(fd[1]);為什么都需要關(guān)閉一個(gè)?
調(diào)用fork后,子進(jìn)程會(huì)復(fù)制父進(jìn)程的進(jìn)程信息,如文件描述符,這樣fd, fd在子進(jìn)程中有同樣的一個(gè)拷貝,他們的引用物游野都為2,也就是兩個(gè)進(jìn)程在使用他們。而實(shí)際上父進(jìn)程只使用fd,子進(jìn)程磨螞只罩喊使用fd,這樣如果父進(jìn)程不想使用fd了,調(diào)用close()來關(guān)閉fd,這是不成功的,因?yàn)檫@樣只是將fd的引用減少到1,fd沒有被系統(tǒng)回收,仍然在子進(jìn)程中有效,所以必須父進(jìn)程close(fd);子進(jìn)程close(fd)
調(diào)用fork后,子進(jìn)程會(huì)復(fù)制父進(jìn)程的進(jìn)程信息,如
文件描述符
,這樣fd, fd在子進(jìn)程中有同物游野樣的一個(gè)拷貝,他們的引用都為2,也就是兩個(gè)進(jìn)程在使用他們。而實(shí)際上父進(jìn)程只使用fd,子進(jìn)程只使用fd,這樣如果父進(jìn)程不想罩喊使用fd了,調(diào)用close()來關(guān)閉fd,這是不成功的,因?yàn)檫@樣只是將fd的引用減少到1,fd沒有被磨螞系統(tǒng)回收,仍然在子進(jìn)程中有效,所以必須父進(jìn)程close(fd);子進(jìn)程close(fd)
管道里面是字節(jié)流,父子進(jìn)程都寫、都仔搭讀,就會(huì)導(dǎo)致內(nèi)容混在一如戚蘆起,對(duì)于讀管道的一方,解析起來就比較困難。常規(guī)的使用方法是父子進(jìn)程一方只能寫入,另一方只能讀出,管道變成一個(gè)單向的通道,渣帶以方便使用。
關(guān)于linux 父子進(jìn)程 關(guān)系的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
本文名稱:深入理解Linux中父子進(jìn)程的關(guān)系(linux父子進(jìn)程關(guān)系)
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/djscpog.html


咨詢
建站咨詢
