在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

fork出的進(jìn)程的父進(jìn)程是從哪來(lái)的

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-24 18:41 ? 次閱讀

一、粉絲提問(wèn)

fork出的進(jìn)程的父進(jìn)程是從哪來(lái)的?

粉絲提問(wèn),一口君必須滿足

粉絲提問(wèn)

二、解答

這個(gè)問(wèn)題看上去很簡(jiǎn)單,但是要想把進(jìn)程的父進(jìn)程相關(guān)的所有知識(shí)點(diǎn)搞清楚,還是有點(diǎn)難度的,下面我們稍微拓展下,分幾點(diǎn)來(lái)講解這個(gè)知識(shí)點(diǎn)。

1. 如何查看進(jìn)程ID

每個(gè)linux進(jìn)程都一定有一個(gè)唯一的數(shù)字標(biāo)識(shí)符,稱(chēng)為進(jìn)程ID(process ID),進(jìn)程ID總是一非負(fù)整數(shù),它的父進(jìn)程叫PPID。

查看進(jìn)程ID命令:

ps -ef

查看進(jìn)程

也可以使用函數(shù)來(lái)獲得進(jìn)程ID:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); 返回:調(diào)用進(jìn)程的進(jìn)程ID
pid_t getppid(void); 返回:調(diào)用進(jìn)程的父進(jìn)程ID

2. 第一個(gè)進(jìn)程init

Linux內(nèi)核啟動(dòng)之后,會(huì)創(chuàng)建第一個(gè)用戶級(jí)進(jìn)程init,由上圖可知, init 進(jìn)程 (pid=1) 是除了 idle 進(jìn)程 (pid=0,也就是 init_task) 之外另一個(gè)比較特殊的進(jìn)程,它是 Linux 內(nèi)核開(kāi)始建立起進(jìn)程概念時(shí)第一個(gè)通過(guò) kernel_thread 產(chǎn)生的進(jìn)程,其開(kāi)始在內(nèi)核態(tài)執(zhí)行,然后通過(guò)一個(gè)系統(tǒng)調(diào)用,開(kāi)始執(zhí)行用戶空間的 / sbin/init 程序。

3. fork函數(shù)

創(chuàng)建一個(gè)進(jìn)程很簡(jiǎn)單,先來(lái)認(rèn)識(shí)一下fork函數(shù):

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回:子進(jìn)程中為0,父進(jìn)程中為子進(jìn)程I D,出錯(cuò)為-1

由fork創(chuàng)建的新進(jìn)程被稱(chēng)為子進(jìn)程( child process)。該函數(shù)被調(diào)用一次,但返回兩次,兩次返回的區(qū)別是子進(jìn)程的返回值是0,而父進(jìn)程的返回值則是子進(jìn)程的進(jìn)程ID。

一般來(lái)說(shuō),在f o r k之后是父進(jìn)程先執(zhí)行還是子進(jìn)程先執(zhí)行是不確定的。這取決于內(nèi)核所使用的調(diào)度算法

「舉例:」

#include <unistd.h>
int main()

pid_t pid;

if ((pid = fork()) == -1) {
perror("fork");
return -1;
} else if (pid == 0) {
this is child process
printf("The return value is %d In child process!! My PID is %d, My PPID is %d", pid,getpid(), getppid());

} else {
this is parent
printf("The return value is %d In parent process!! My PID is %d, My PPID is %d", pid,getpid(), getppid());

return 0;

執(zhí)行結(jié)果:

fork

由上圖可知,fork被調(diào)用了一次,返回了兩次。

【拓展】

使用fork函數(shù)得到的子進(jìn)程是父進(jìn)程的處繼承了整個(gè)進(jìn)程的地址空間,包括:「進(jìn)程上下文、進(jìn)程堆棧、內(nèi)存信息、打開(kāi)的文件描述符、信號(hào)控制設(shè)置、進(jìn)程優(yōu)先級(jí)、進(jìn)程組號(hào)、當(dāng)前工作目錄、根目錄、資源限制、控制終端」等。

fork

fork出的子進(jìn)程會(huì)集成父進(jìn)程的文件描述符,如果讀寫(xiě)文件,父子進(jìn)程之間會(huì)互相影響。

4. ./run 運(yùn)行的程序父進(jìn)程是誰(shuí)?

我們來(lái)編寫(xiě)一個(gè)例子:

int main(int argc, const char *argv[])

while(1);
return 0;

編譯執(zhí)行

gcc test.c
./a.out

例子很簡(jiǎn)單,就是創(chuàng)建一個(gè)死循環(huán)的進(jìn)程。

ps -ef 查看進(jìn)程ID

執(zhí)行結(jié)果

由上圖可知,a.out進(jìn)程的進(jìn)程ID是2991,父進(jìn)程ID是2675,即進(jìn)程bash:

2665

bash的父進(jìn)程是gnome-terminal,所以大家應(yīng)該明白,我們打開(kāi)1個(gè)Linux終端,其實(shí)就是啟動(dòng)了1個(gè)gnome-terminal進(jìn)程。我們?cè)谶@個(gè)終端上執(zhí)行./a.out其實(shí)就是利用gnome-terminal的子進(jìn)程bash通過(guò)execve()將創(chuàng)建的子進(jìn)程裝入a.out:

strace

5. 進(jìn)程和終端的關(guān)系

關(guān)于進(jìn)程和終端的關(guān)系可以參考以下文章:

《進(jìn)程組、會(huì)話、控制終端概念,如何創(chuàng)建守護(hù)進(jìn)程?》

6. 父進(jìn)程死了,子進(jìn)程怎么辦?

1) 僵尸進(jìn)程

僵尸進(jìn)程

如上圖所示,

父進(jìn)程Process A創(chuàng)建子進(jìn)程Process B,當(dāng)子進(jìn)程退出時(shí)會(huì)給父進(jìn)程發(fā)送信號(hào)SIGCHLD;如果父進(jìn)程沒(méi)有調(diào)用wait等待子進(jìn)程結(jié)束,退出狀態(tài)丟失,轉(zhuǎn)換成僵死狀態(tài),子進(jìn)程會(huì)變成一個(gè)僵尸進(jìn)程。

當(dāng)父進(jìn)程調(diào)用wait,僵尸子進(jìn)程的結(jié)束狀態(tài)被提取出來(lái),子進(jìn)程被刪除,并且wait函數(shù)立刻返回。

實(shí)例

#include <sys/types.h>
#include <unistd.h>
create a ZOMBIE
* ps -ax | grep a.out to show the zombie

int main()

if(fork()) {
//父進(jìn)程
while(1){
sleep(1);


//子進(jìn)程

上述程序會(huì)保證父進(jìn)程不退出,一直在while(1)中無(wú)限循環(huán),而子進(jìn)程會(huì)立刻退出。

僵尸進(jìn)程

由上圖可知,父進(jìn)程是3096,子進(jìn)程是3097,子進(jìn)程因?yàn)橥顺龊蟾高M(jìn)程沒(méi)有調(diào)用wait回收子進(jìn)程資源,所以子進(jìn)程3097變成僵尸進(jìn)程defunct。

ps -ax | grep a.out 查看進(jìn)程狀態(tài)

僵尸進(jìn)程

2) 孤兒進(jìn)程

如果父進(jìn)程退出,并且沒(méi)有調(diào)用wait函數(shù),它的子進(jìn)程就變成孤兒進(jìn)程,會(huì)被一個(gè)特殊進(jìn)程繼承,這就是init進(jìn)程,init 進(jìn)程會(huì)自動(dòng)清理所有它繼承的僵尸進(jìn)程。

實(shí)例代碼:

#include <sys/types.h>
#include <unistd.h>

int main()

if(fork()) {
//父進(jìn)程

}else{
//子進(jìn)程
while(1){
sleep(1);


上述程序會(huì)保證子進(jìn)程不退出,一直在while(1)中無(wú)限循環(huán),而父進(jìn)程會(huì)立刻退出。

孤兒進(jìn)程:

孤兒進(jìn)程

./a.out的父進(jìn)程ID變成1,所以該子進(jìn)程被init進(jìn)程繼承。

三、其他啟動(dòng)進(jìn)程的方法

1. exec族函數(shù)

fork函數(shù)用于創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程幾乎拷貝了父進(jìn)程的全部?jī)?nèi)容。exec函數(shù)族提供了一種在進(jìn)程中啟動(dòng)另一個(gè)程序執(zhí)行的方法。它可以根據(jù)指定的文件名或目錄名找到可執(zhí)行文件,并用它來(lái)取代原調(diào)用進(jìn)程的數(shù)據(jù)段、代碼段和堆棧段。在執(zhí)行完之后,原調(diào)用進(jìn)程的內(nèi)容除了進(jìn)程號(hào)外,其他全部都被替換了。可執(zhí)行文件既可以是二進(jìn)制文件,也可以是任何Linux下可執(zhí)行的腳本文件。

每當(dāng)進(jìn)程調(diào)用一種exec函數(shù)時(shí),該進(jìn)程完全由新程序代換,而新程序從main函數(shù)開(kāi)始執(zhí)行。Exec并不創(chuàng)建新進(jìn)程,所以前后進(jìn)程ID也不會(huì)變。Exec只是用另一個(gè)新程序替換了當(dāng)前進(jìn)程的正文、數(shù)據(jù)、堆和棧段。

「何時(shí)使用?」

當(dāng)進(jìn)程認(rèn)為自己不能再為系統(tǒng)和用戶做出任何貢獻(xiàn)了時(shí)就可以調(diào)用exec函數(shù),讓自己執(zhí)行新的程序如果某個(gè)進(jìn)程想同時(shí)執(zhí)行另一個(gè)程序,它就可以調(diào)用fork函數(shù)創(chuàng)建子進(jìn)程,然后在子進(jìn)程中調(diào)用任何一個(gè)exec函數(shù)。這樣看起來(lái)就好像通過(guò)執(zhí)行應(yīng)用程序而產(chǎn)生了一個(gè)新進(jìn)程一樣。

「函數(shù)原型」

函數(shù)原型

2. cron命令

在Linux系統(tǒng)中,計(jì)劃任務(wù)一般是由cron承擔(dān),我們可以把cron設(shè)置為開(kāi)機(jī)時(shí)自動(dòng)啟動(dòng)。cron啟動(dòng)后,它會(huì)讀取它的所有配置文件(全局性配置文件/etc/crontab,以及每個(gè)用戶的計(jì)劃任務(wù)配置文件),然后cron會(huì)根據(jù)命令和執(zhí)行時(shí)間來(lái)按時(shí)來(lái)調(diào)用度工作任務(wù)。

檢查cron是否安裝:

ps -ef | grep cron

croncrontab -u //設(shè)定某個(gè)用戶的cron服務(wù),一般root用戶在執(zhí)行這個(gè)命令的時(shí)候需要此參數(shù)
crontab -l //列出某個(gè)用戶cron服務(wù)的詳細(xì)內(nèi)容
crontab -r //刪除某個(gè)用戶的cron服務(wù)
crontab -e //編輯某個(gè)用戶的cron服務(wù)

root查看自己的cron設(shè)置:

crontab -u root -l

或者直接看自己名下的任務(wù):

crontab -l

創(chuàng)建任務(wù):

crontab -e

打開(kāi)默認(rèn)編輯器編輯后保存退出即可

編輯基本格式 :

*****command
分 時(shí) 日 月 周 命令
第1列表示分鐘1~59 每分鐘用*或者 1表示
第2列表示小時(shí)1~23(0表示0點(diǎn))
第3列表示日期1~31
第4列表示月份1~12
第5列標(biāo)識(shí)號(hào)星期0~6(0表示星期天)
第6列要運(yùn)行的命令
如果寫(xiě)為*, 表示每X
如果想定義間隔,在X后加"/"和間隔的數(shù)字

每隔一分鐘打印一下系統(tǒng)時(shí)間

1 * * * * date >> ~/t.log //>> means append

3. at

在linux系統(tǒng)如果你想要讓自己設(shè)計(jì)的備份程序可以自動(dòng)在某個(gè)時(shí)間點(diǎn)開(kāi)始在系統(tǒng)底下運(yùn)行,而不需要手動(dòng)來(lái)啟動(dòng)它,又該如何處置呢?

這些例行的工作可能又分為一次性定時(shí)工作與循環(huán)定時(shí)工作,在系統(tǒng)內(nèi)又是哪些服務(wù)在負(fù)責(zé)?

還有,如果你想要每年在老婆的生日前一天就發(fā)出一封信件提醒自己不要忘記,linux系統(tǒng)下該怎么做呢?

但是crontab 主要用來(lái)提交不斷循環(huán)執(zhí)行的job, 而at 用來(lái)提交一段時(shí)間后執(zhí)行的job(執(zhí)行完就自動(dòng)刪除整個(gè)job)

「舉例:」

1) 首先檢查atd服務(wù)有無(wú)開(kāi)啟在一個(gè)指定的時(shí)間執(zhí)行一個(gè)指定任務(wù),只能執(zhí)行一次,且需要開(kāi)啟atd進(jìn)程

ps -ef | grep atd查看,
開(kāi)啟用/etc/init.d/atd start or restart;
開(kāi)機(jī)即啟動(dòng)則需要運(yùn)行 chkconfig --level 2345 atd on

2) 定時(shí)在11:30am用ls列出當(dāng)前目錄內(nèi)容并寫(xiě)入~/log文件

cd ~
at 11:30am today
at>ls > ~/t.log
at> <EOT> //按Ctl-D退出

審核編輯:符乾江


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    203

    瀏覽量

    13962
  • Fork
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3316
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入解析Linux程序與進(jìn)程

    什么是程序 一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,用于指導(dǎo)計(jì)算機(jī)執(zhí)行特定任務(wù)或解決特定問(wèn)題。程序通常由代碼、數(shù)據(jù)和資源文件組成,涉及語(yǔ)法、算法和數(shù)據(jù)結(jié)構(gòu)。為二進(jìn)制文件 什么是進(jìn)程 是一個(gè)具有獨(dú)立功能的程序
    的頭像 發(fā)表于 12-18 11:01 ?96次閱讀
    深入解析Linux程序與<b class='flag-5'>進(jìn)程</b>

    程序和進(jìn)程的區(qū)別

    比如: 開(kāi)發(fā)寫(xiě)的代碼我們稱(chēng)為程序,那么將開(kāi)發(fā)的代碼運(yùn)行起來(lái)。我們稱(chēng)為進(jìn)程
    的頭像 發(fā)表于 11-25 16:03 ?319次閱讀
    程序和<b class='flag-5'>進(jìn)程</b>的區(qū)別

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    優(yōu)先級(jí)、文件描述符(記錄當(dāng)前進(jìn)程打開(kāi)的文件)、主要進(jìn)程標(biāo)識(shí)的進(jìn)程號(hào)和進(jìn)程號(hào): 進(jìn)程號(hào)(PID
    發(fā)表于 11-04 15:15

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與進(jìn)程池來(lái)提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?410次閱讀
    Python中多線程和多<b class='flag-5'>進(jìn)程</b>的區(qū)別

    Linux用戶身份與進(jìn)程權(quán)限詳解

    在學(xué)習(xí) Linux 系統(tǒng)權(quán)限相關(guān)的主題時(shí),我們首先關(guān)注的基本都是文件的 ugo 權(quán)限。ugo 權(quán)限信息是文件的屬性,它指明了用戶與文件之間的關(guān)系。但是真正操作文件的卻是進(jìn)程,也就是說(shuō)用戶所擁有的文件
    的頭像 發(fā)表于 10-23 11:41 ?368次閱讀
    Linux用戶身份與<b class='flag-5'>進(jìn)程</b>權(quán)限詳解

    【軟件干貨】Android應(yīng)用進(jìn)程如何保活?

    在Android應(yīng)用程序中,為了保證應(yīng)用的正常運(yùn)行和穩(wěn)定性,有時(shí)需要對(duì)應(yīng)用進(jìn)程進(jìn)行保活。以下是一些實(shí)現(xiàn)進(jìn)程保活的方法:
    的頭像 發(fā)表于 10-15 17:05 ?452次閱讀
    【軟件干貨】Android應(yīng)用<b class='flag-5'>進(jìn)程</b>如何保活?

    深入探討Linux的進(jìn)程調(diào)度器

    Linux操作系統(tǒng)作為一個(gè)開(kāi)源且廣泛應(yīng)用的操作系統(tǒng),其內(nèi)核設(shè)計(jì)包含了許多核心功能,而進(jìn)程調(diào)度器(Scheduler)就是其中一個(gè)至關(guān)重要的模塊。進(jìn)程調(diào)度器負(fù)責(zé)決定在任何給定的時(shí)刻哪個(gè)進(jìn)程可以運(yùn)行
    的頭像 發(fā)表于 08-13 13:36 ?955次閱讀
    深入探討Linux的<b class='flag-5'>進(jìn)程</b>調(diào)度器

    鴻蒙開(kāi)發(fā):【進(jìn)程模型】

    應(yīng)用中(同一Bundle名稱(chēng))的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是運(yùn)行在同一個(gè)獨(dú)立進(jìn)程(主進(jìn)程)中,如下圖中綠色部分的“Main Process”。
    的頭像 發(fā)表于 06-13 09:53 ?291次閱讀
    鴻蒙開(kāi)發(fā):【<b class='flag-5'>進(jìn)程</b>模型】

    Linxu進(jìn)程的延遲與周期調(diào)度

    pstree 命令以樹(shù)狀結(jié)構(gòu)顯示系統(tǒng)進(jìn)程的繼承關(guān)系。樹(shù)狀圖將會(huì)以 pid (如果有指定) 或是以 init 為根,如果指定 user,則樹(shù)狀結(jié)構(gòu)只顯示該用戶所擁有的進(jìn)程
    發(fā)表于 04-18 11:24 ?183次閱讀

    true studio調(diào)試,只顯示匯編進(jìn)程不顯示C進(jìn)程的原因?

    true studio 調(diào)試,只顯示匯編進(jìn)程,不顯示C進(jìn)程的原因?
    發(fā)表于 04-18 06:56

    進(jìn)程間通信的消息隊(duì)列介紹

    消息隊(duì)列是一種非常常見(jiàn)的進(jìn)程間通信方式。
    的頭像 發(fā)表于 04-08 17:27 ?313次閱讀

    HarmonyOS跨進(jìn)程通信—IPC與RPC通信開(kāi)發(fā)

    一、IPC與RPC通信概述 基本概念 IPC(Inter-Process Communication)與RPC(Remote Procedure Call)用于實(shí)現(xiàn)跨進(jìn)程通信,不同的是前者
    的頭像 發(fā)表于 02-02 17:47 ?1295次閱讀
    HarmonyOS跨<b class='flag-5'>進(jìn)程</b>通信—IPC與RPC通信開(kāi)發(fā)

    淺談Linux的進(jìn)程

    進(jìn)程和程序的區(qū)別: 進(jìn)程是動(dòng)態(tài)的,程序是靜態(tài)的 一、進(jìn)程的創(chuàng)建(fork()函數(shù)) int main(){ pid_t pid; pid=fork
    的頭像 發(fā)表于 01-28 15:54 ?261次閱讀
    淺談Linux的<b class='flag-5'>進(jìn)程</b>

    線程、進(jìn)程、多線程、多進(jìn)程和多任務(wù)之間有何關(guān)系?

    進(jìn)程是程序執(zhí)行時(shí)的一個(gè)實(shí)例,即它是程序已經(jīng)執(zhí)行到課中程度的數(shù)據(jù)結(jié)構(gòu)的匯集。內(nèi)核的觀點(diǎn)看,進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間、內(nèi)存等)的基本單位。
    的頭像 發(fā)表于 01-11 13:39 ?366次閱讀
    線程、<b class='flag-5'>進(jìn)程</b>、多線程、多<b class='flag-5'>進(jìn)程</b>和多任務(wù)之間有何關(guān)系?

    mcu線程和進(jìn)程的區(qū)別是什么

    MCU線程和進(jìn)程是嵌入式系統(tǒng)中常見(jiàn)的并行執(zhí)行的概念,它們之間有許多區(qū)別,包括線程與進(jìn)程的定義、資源管理、通信機(jī)制、執(zhí)行方式等等。下面將詳細(xì)介紹MCU線程和進(jìn)程的區(qū)別。 一、定義與概念 MCU線程
    的頭像 發(fā)表于 01-04 10:45 ?766次閱讀
    主站蜘蛛池模板: 国产精品 色| 久操视频在线播放| 亚洲1区2区3区4区| 69xxxⅹxxxxxx日本| 中文字幕一二三四区| 视频一区二区在线观看| 免费在线观看一区二区| 最近2018中文字幕2019视频 | 国产三级 在线播放| 丁香啪啪天堂激情婷婷| 97综合视频| 手机成人在线视频| 大又大又粗又爽女人毛片| xxxx日本在线播放免费不卡| 色视频免费观看高清完整| 中文字幕有码在线视频| 特级一级毛片视频免费观看| 日韩欧美一卡二区| 狠狠鲁狠狠操| 午夜资源在线| 高h视频网站| 日本aaaaa特黄毛片| 午夜色婷婷| 美女黄页网| 夜夜爽爽爽| www.五月婷| 国产精品丝袜xxxxxxx| 色多多福利| 东莞a级毛片| 免费福利午夜影视网| 777黄色片| 天堂在线国产| 狠狠躁夜夜躁人人爽天天天天| 午夜手机看片| 日韩欧美高清色码| 在线观看国产精美视频| 欧美巨大bbbb动漫| 亚洲成a人片在线看| 五月天激情在线| 亚洲综合成人网| 久久精品视频观看|