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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

fork出的進程的父進程是從哪來的

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 18:41 ? 次閱讀

一、粉絲提問

fork出的進程的父進程是從哪來的?

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

粉絲提問

二、解答

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

1. 如何查看進程ID

每個linux進程都一定有一個唯一的數字標識符,稱為進程ID(process ID),進程ID總是一非負整數,它的父進程叫PPID。

查看進程ID命令:

ps -ef

查看進程

也可以使用函數來獲得進程ID:

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

2. 第一個進程init

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

3. fork函數

創建一個進程很簡單,先來認識一下fork函數:

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

由fork創建的新進程被稱為子進程( child process)。該函數被調用一次,但返回兩次,兩次返回的區別是子進程的返回值是0,而父進程的返回值則是子進程的進程ID。

一般來說,在f o r k之后是父進程先執行還是子進程先執行是不確定的。這取決于內核所使用的調度算法

「舉例:」

#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;

執行結果:

fork

由上圖可知,fork被調用了一次,返回了兩次。

【拓展】

使用fork函數得到的子進程是父進程的處繼承了整個進程的地址空間,包括:「進程上下文、進程堆棧、內存信息、打開的文件描述符、信號控制設置、進程優先級、進程組號、當前工作目錄、根目錄、資源限制、控制終端」等。

fork

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

4. ./run 運行的程序父進程是誰?

我們來編寫一個例子:

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

while(1);
return 0;

編譯執行

gcc test.c
./a.out

例子很簡單,就是創建一個死循環的進程。

ps -ef 查看進程ID

執行結果

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

2665

bash的父進程是gnome-terminal,所以大家應該明白,我們打開1個Linux終端,其實就是啟動了1個gnome-terminal進程。我們在這個終端上執行./a.out其實就是利用gnome-terminal的子進程bash通過execve()將創建的子進程裝入a.out:

strace

5. 進程和終端的關系

關于進程和終端的關系可以參考以下文章:

《進程組、會話、控制終端概念,如何創建守護進程?》

6. 父進程死了,子進程怎么辦?

1) 僵尸進程

僵尸進程

如上圖所示,

父進程Process A創建子進程Process B,當子進程退出時會給父進程發送信號SIGCHLD;如果父進程沒有調用wait等待子進程結束,退出狀態丟失,轉換成僵死狀態,子進程會變成一個僵尸進程。

當父進程調用wait,僵尸子進程的結束狀態被提取出來,子進程被刪除,并且wait函數立刻返回。

實例

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

int main()

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


//子進程

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

僵尸進程

由上圖可知,父進程是3096,子進程是3097,子進程因為退出后父進程沒有調用wait回收子進程資源,所以子進程3097變成僵尸進程defunct。

ps -ax | grep a.out 查看進程狀態

僵尸進程

2) 孤兒進程

如果父進程退出,并且沒有調用wait函數,它的子進程就變成孤兒進程,會被一個特殊進程繼承,這就是init進程,init 進程會自動清理所有它繼承的僵尸進程。

實例代碼:

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

int main()

if(fork()) {
//父進程

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


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

孤兒進程:

孤兒進程

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

三、其他啟動進程的方法

1. exec族函數

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

每當進程調用一種exec函數時,該進程完全由新程序代換,而新程序從main函數開始執行。Exec并不創建新進程,所以前后進程ID也不會變。Exec只是用另一個新程序替換了當前進程的正文、數據、堆和棧段。

「何時使用?」

當進程認為自己不能再為系統和用戶做出任何貢獻了時就可以調用exec函數,讓自己執行新的程序如果某個進程想同時執行另一個程序,它就可以調用fork函數創建子進程,然后在子進程中調用任何一個exec函數。這樣看起來就好像通過執行應用程序而產生了一個新進程一樣。

「函數原型」

函數原型

2. cron命令

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

檢查cron是否安裝:

ps -ef | grep cron

croncrontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除某個用戶的cron服務
crontab -e //編輯某個用戶的cron服務

root查看自己的cron設置:

crontab -u root -l

或者直接看自己名下的任務:

crontab -l

創建任務:

crontab -e

打開默認編輯器編輯后保存退出即可

編輯基本格式 :

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

每隔一分鐘打印一下系統時間

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

3. at

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

這些例行的工作可能又分為一次性定時工作與循環定時工作,在系統內又是哪些服務在負責?

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

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

「舉例:」

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

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

2) 定時在11:30am用ls列出當前目錄內容并寫入~/log文件

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

審核編輯:符乾江


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 進程
    +關注

    關注

    0

    文章

    206

    瀏覽量

    14181
  • Fork
    +關注

    關注

    0

    文章

    14

    瀏覽量

    3424
收藏 人收藏

    評論

    相關推薦

    Linux后臺進程管理詳解

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

    Linux系統進程管理入門指南

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

    Linux進程狀態詳解

    進程狀態是task_struct內的一個整數;進行:進程在調度隊列中,進程的狀態都是running,阻塞:等待某種設備或者資源就緒。進程是一個隊列,設備也是一個隊列,當我們讀磁盤,讀網
    的頭像 發表于 04-01 09:46 ?179次閱讀
    Linux<b class='flag-5'>進程</b>狀態詳解

    深入解析Linux程序與進程

    什么是程序 一組計算機能識別和執行的指令,用于指導計算機執行特定任務或解決特定問題。程序通常由代碼、數據和資源文件組成,涉及語法、算法和數據結構。為二進制文件 什么是進程 是一個具有獨立功能的程序
    的頭像 發表于 12-18 11:01 ?346次閱讀
    深入解析Linux程序與<b class='flag-5'>進程</b>

    程序和進程的區別

    比如: 開發寫的代碼我們稱為程序,那么將開發的代碼運行起來。我們稱為進程
    的頭像 發表于 11-25 16:03 ?891次閱讀
    程序和<b class='flag-5'>進程</b>的區別

    深入Linux進程管理:提升效率與穩定性的關鍵方法

    目錄 Linux進程管理 8.1 IO負載 8.2 實時進程監控 5.1 作業與會話 5.2 作業分類 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發表于 11-22 11:05 ?607次閱讀
    深入Linux<b class='flag-5'>進程</b>管理:提升效率與穩定性的關鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    優先級、文件描述符(記錄當前進程打開的文件)、主要進程標識的進程號和進程號: 進程號(PID
    發表于 11-04 15:15

    Python中多線程和多進程的區別

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

    Linux用戶身份與進程權限詳解

    在學習 Linux 系統權限相關的主題時,我們首先關注的基本都是文件的 ugo 權限。ugo 權限信息是文件的屬性,它指明了用戶與文件之間的關系。但是真正操作文件的卻是進程,也就是說用戶所擁有的文件
    的頭像 發表于 10-23 11:41 ?641次閱讀
    Linux用戶身份與<b class='flag-5'>進程</b>權限詳解

    【軟件干貨】Android應用進程如何保活?

    在Android應用程序中,為了保證應用的正常運行和穩定性,有時需要對應用進程進行保活。以下是一些實現進程保活的方法:
    的頭像 發表于 10-15 17:05 ?887次閱讀
    【軟件干貨】Android應用<b class='flag-5'>進程</b>如何保活?

    深入探討Linux的進程調度器

    Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個進程可以運行
    的頭像 發表于 08-13 13:36 ?1131次閱讀
    深入探討Linux的<b class='flag-5'>進程</b>調度器

    鴻蒙語言基礎類庫:ohos.process 獲取進程相關的信息

    進程可以獲取子進程的標準輸入輸出,以及發送信號和關閉子進程
    的頭像 發表于 07-08 17:13 ?583次閱讀
    鴻蒙語言基礎類庫:ohos.process  獲取<b class='flag-5'>進程</b>相關的信息

    鴻蒙開發:【進程模型概述】

    應用中(同一包名)的所有PageAbility、ServiceAbility、DataAbility、FormAbility運行在同一個獨立進程中,即圖中綠色部分的“Main Process”。
    的頭像 發表于 06-22 10:09 ?411次閱讀
    鴻蒙開發:【<b class='flag-5'>進程</b>模型概述】

    鴻蒙開發:【進程模型】

    應用中(同一Bundle名稱)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是運行在同一個獨立進程(主進程)中,如下圖中綠色部分的“Main Process”。
    的頭像 發表于 06-13 09:53 ?451次閱讀
    鴻蒙開發:【<b class='flag-5'>進程</b>模型】

    一句話讓你理解線程和進程

    今天給大家分享一下線程與進程,主要包含以下幾部分內容:一句話說明線程和進程操作系統為什么需要進程為什么要引入線程一圖說明線程和進程的關系一句話讓你理解
    的頭像 發表于 06-04 08:04 ?1450次閱讀
    一句話讓你理解線程和<b class='flag-5'>進程</b>
    主站蜘蛛池模板: 天天操天天干天天舔 | 2021最新国产成人精品视频 | 在线观看亚洲专3333 | 男女刺激性视频大片 | 婷婷在线网站 | 欧美一级片免费在线观看 | 色中涩| 天天操天天干天天做 | 一区一精品 | 日本亚洲欧美美色 | 国产黄网站在线观看 | 狠狠躁夜夜躁人人爽天天天天 | 曰本在线 | 天天在线天天综合网色 | 久久99精品久久久久久秒播 | 人人看人人添人人爽 | 最新黄色免费网站 | 二级黄绝大片中国免费视频 | 午夜在线免费观看 | www.四虎影院在线观看 | www.色播| 性感美女逼 | 一级片视频在线观看 | 中文字幕色 | 九月婷婷综合婷婷 | 国产日本久久久久久久久婷婷 | 亚洲欧美精品一区二区 | 日日干天天操 | 日本欧美一区二区免费视 | 久草在线资源网 | 九九热视频免费在线观看 | 天天靠天天擦天天摸 | 亚洲色图 在线视频 | 天天干天天操天天干 | 男女一进一出抽搐免费视频 | 一级毛片免费在线观看网站 | 激情六月婷婷开心丁香开心 | 日本黄色免费片 | 欧美3d动漫网站 | 免费一级欧美片片线观看 | 色吧亚洲欧美另类 |