chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-24 18:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、粉絲提問

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

粉絲提問,一口君必須滿足

粉絲提問

二、解答

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

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

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

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

ps -ef

查看進(jìn)程

也可以使用函數(shù)來獲得進(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. 第一個進(jìn)程init

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

3. fork函數(shù)

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

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

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

一般來說,在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)程的處繼承了整個進(jìn)程的地址空間,包括:「進(jìn)程上下文、進(jìn)程堆棧、內(nèi)存信息、打開的文件描述符、信號控制設(shè)置、進(jìn)程優(yōu)先級、進(jìn)程組號、當(dāng)前工作目錄、根目錄、資源限制、控制終端」等。

fork

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

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

我們來編寫一個例子:

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

while(1);
return 0;

編譯執(zhí)行

gcc test.c
./a.out

例子很簡單,就是創(chuàng)建一個死循環(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)該明白,我們打開1個Linux終端,其實(shí)就是啟動了1個gnome-terminal進(jìn)程。我們在這個終端上執(zhí)行./a.out其實(shí)就是利用gnome-terminal的子進(jìn)程bash通過execve()將創(chuàng)建的子進(jìn)程裝入a.out:

strace

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

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

《進(jìn)程組、會話、控制終端概念,如何創(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)程退出時會給父進(jìn)程發(fā)送信號SIGCHLD;如果父進(jìn)程沒有調(diào)用wait等待子進(jìn)程結(jié)束,退出狀態(tài)丟失,轉(zhuǎn)換成僵死狀態(tài),子進(jìn)程會變成一個僵尸進(jìn)程。

當(dāng)父進(jìn)程調(diào)用wait,僵尸子進(jìn)程的結(jié)束狀態(tà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)程

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

僵尸進(jìn)程

由上圖可知,父進(jìn)程是3096,子進(jìn)程是3097,子進(jìn)程因?yàn)橥顺龊蟾高M(jìn)程沒有調(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)程退出,并且沒有調(diào)用wait函數(shù),它的子進(jìn)程就變成孤兒進(jìn)程,會被一個特殊進(jìn)程繼承,這就是init進(jìn)程,init 進(jìn)程會自動清理所有它繼承的僵尸進(jìn)程。

實(shí)例代碼:

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

int main()

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

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


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

孤兒進(jìn)程:

孤兒進(jìn)程

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

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

1. exec族函數(shù)

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

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

「何時使用?」

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

「函數(shù)原型」

函數(shù)原型

2. cron命令

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

檢查cron是否安裝:

ps -ef | grep cron

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

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

crontab -u root -l

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

crontab -l

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

crontab -e

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

編輯基本格式 :

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

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

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

3. at

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

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

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

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

「舉例:」

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

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

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

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

審核編輯:符乾江


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

    關(guān)注

    0

    文章

    211

    瀏覽量

    14560
  • Fork
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3650
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Nginx中Master與Worker進(jìn)程的工作機(jī)制

    Nginx是現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中最常用的Web服務(wù)器和反向代理軟件。很多運(yùn)維工程師使用Nginx多年,卻對其核心架構(gòu)一知半解,配置優(yōu)化時只會機(jī)械地調(diào)整幾個參數(shù)。本文Nginx進(jìn)程模型出發(fā),深入講解worker進(jìn)程的工作機(jī)制,幫助你
    的頭像 發(fā)表于 04-08 14:21 ?98次閱讀

    飛凌嵌入式ElfBoard-進(jìn)程進(jìn)程狀態(tài)

    信號;處于暫停態(tài)的進(jìn)程是可以恢復(fù)進(jìn)入到就緒態(tài)的,如收到 SIGCONT 信號;?Z (Zombie):退出狀態(tài),進(jìn)程成為僵尸進(jìn)程,僵尸態(tài)進(jìn)程其實(shí)指的就是僵尸
    發(fā)表于 03-27 09:12

    飛凌嵌入式ElfBoard-進(jìn)程的相關(guān)信息之父進(jìn)程和子進(jìn)程

    進(jìn)程在創(chuàng)建時,創(chuàng)建進(jìn)程是新進(jìn)程進(jìn)程,新進(jìn)程是創(chuàng)建進(jìn)程
    發(fā)表于 03-12 17:12

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    在Linux系統(tǒng)中,有些基本命令能夠查看到進(jìn)程的信息。例如ps、top、pgrep、pstree等;這些命令為用戶提供了查看和管理Linux進(jìn)程信息的多種功能。通過合理使用這些命令,用戶可以監(jiān)控
    發(fā)表于 03-02 08:49

    Linux進(jìn)程管理不用愁!這6個工具幫你搞定90%場景

    在 Linux 系統(tǒng)中,進(jìn)程是資源分配的基本單位,無論是服務(wù)器運(yùn)維、程序調(diào)試還是日常使用,掌握進(jìn)程管理工具都是必備技能。今天就帶大家梳理 6 個最常用的進(jìn)程管理工具,查看
    的頭像 發(fā)表于 02-04 16:23 ?2731次閱讀
    Linux<b class='flag-5'>進(jìn)程</b>管理不用愁!這6個工具幫你搞定90%場景

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    會解析命令并查找對應(yīng)的可執(zhí)行文件位置,通常在系統(tǒng)的 PATH 環(huán)境變量中指定的目錄中。2.Shell 使用 fork() 函數(shù)創(chuàng)建一個新進(jìn)程。操作系統(tǒng)在內(nèi)核中為新進(jìn)程分配一個唯一的進(jìn)程
    發(fā)表于 01-26 08:42

    進(jìn)程概念和特征

    的間斷性,即進(jìn)程按各自獨(dú)立的、 不可預(yù)知的速度向前推進(jìn)。異步性會導(dǎo)致執(zhí)行結(jié)果的不可再現(xiàn)性,為此,在操作系統(tǒng)中必須配置相應(yīng)的進(jìn)程同步機(jī)制。   5. 結(jié)構(gòu)性:每個進(jìn)程都配置一個PCB對其進(jìn)行描述。
    發(fā)表于 01-15 06:39

    進(jìn)程通信

    直接把消息發(fā)送給接收進(jìn)程,并將它掛在接收進(jìn)程的消息緩沖隊列上,接收進(jìn)程消息緩沖隊列中取得消息。   2) 間接通信方式:發(fā)送進(jìn)程把消息發(fā)
    發(fā)表于 01-15 06:16

    進(jìn)程的控制

    不可分割的基本單位。   進(jìn)程的創(chuàng)建   允許一個進(jìn)程創(chuàng)建另一個進(jìn)程。此時創(chuàng)建者稱為進(jìn)程,被創(chuàng)建的
    發(fā)表于 01-15 06:05

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    在Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的多任務(wù)并發(fā)
    的頭像 發(fā)表于 12-24 07:05 ?4558次閱讀
    深入Linux內(nèi)核:<b class='flag-5'>進(jìn)程</b>調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    解析Linux的進(jìn)程、線程和協(xié)程

    系統(tǒng)的穩(wěn)定性和安全性。 (3)創(chuàng)建與銷毀:Linux使用fork()系統(tǒng)調(diào)用來創(chuàng)建新進(jìn)程,通過exit()來終止進(jìn)程。 線程(Thread) 線程是進(jìn)程內(nèi)的執(zhí)行單元,多個線程共享相
    發(fā)表于 12-22 11:00

    Linux進(jìn)程間通信(IPC)全解析:管道到?Socket,一篇講透

    ,Inter-Process Communication) 。 今天我們就來系統(tǒng)梳理?Linux?中最常用的?6?種?IPC?方式,原理到實(shí)例,流程到適用場景,幫你徹底搞懂進(jìn)程間如何?“對話”。 一、管道
    的頭像 發(fā)表于 11-14 21:38 ?1.3w次閱讀
    Linux<b class='flag-5'>進(jìn)程</b>間通信(IPC)全解析:<b class='flag-5'>從</b>管道到?Socket,一篇講透

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux 進(jìn)程創(chuàng)建

    文件夾 cd app 創(chuàng)建fork.c touch fork.c 輸入ls 輸入 vi fork.c 進(jìn)行編程 里面是通過進(jìn)程創(chuàng)建子
    發(fā)表于 09-01 20:49

    Linux后臺進(jìn)程管理詳解

    當(dāng)我們在終端或控制臺工作時,可能不希望由于運(yùn)行一個作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對于密集訪問磁盤的進(jìn)程,我們更希望它能夠在每天的非負(fù)荷高峰時間段運(yùn)行(例如凌晨)。為了使這些進(jìn)程能夠在后臺運(yùn)行,也就是說不在終端屏幕上運(yùn)行,有幾種選擇方法可
    的頭像 發(fā)表于 04-25 11:04 ?1150次閱讀
    Linux后臺<b class='flag-5'>進(jìn)程</b>管理詳解

    Linux系統(tǒng)進(jìn)程管理入門指南

    在 Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?1298次閱讀
    Linux系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門指南