為什麼linux是0 fork出1號程序再fork出shell而不是0程序直接fork出shell?

時間 2021-05-06 01:03:19

1樓:J.FW

這裡只要知道一般情況下pid 1的用處就清楚了, man init:

systemd is a system and service manager for Linux operating systems. When run as first process on boot (as PID 1), it acts as init system that brings up and maintains userspace services.

systemd上述的功能是shell所沒有的, 但是systemd和pid 1並不是等價關係:

1135

/*1136We try each of these until one succeeds.

1137

1138The Bourne shell can be used instead of init if we are

1139trying to recover a really broken machine.

1140

1141if(

execute_command

)1148if(

!try_to_run_init_process

("/sbin/init")||

1149

!try_to_run_init_process

("/etc/init")||

1150

!try_to_run_init_process

("/bin/init")||

1151

!try_to_run_init_process

("/bin/sh"

))1152

return0;

pid 1的本質是run as first process, 這樣pid才能是1:

412413We need to spawn init first so that it obtains pid 1, however

414the init task will end up wanting to create kthreads, which, if

415we schedule it before we create kthreadd, will OOPS.

416417 pid = kernel_thread(kernel_init, NULL, CLONE_FS);

... 429 pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

然後我們又人為賦予pid 1一些特殊性...

2樓:「已登出」

pstree -p | more

init(1)-+-agetty(3148)

|-agetty(3149)

|-agetty(3150)

|-agetty(3151)

|-agetty(3152)

|-agetty(3153)

|-klogd(3071)

|-sshd(3111)---sshd(26588)---zsh(26590)-+-more(26649)

|`-pstree(26648)

|-syslogd(3065)

|-tmux: server(26160)-+-zsh(300)

因為linux需要init來當乙個主的引導,也就是程序之父

而shell並不能起到這個作用,bash csh zsh 都沒有這個能力

而linux設計的理念也是遵循unix早期提出來的,乙個程式只做一件事,並做好

所以init做好自己的事就好了,而shell,事實上,排隊也要排好幾個號才輪到他呢

因為shell是要使用者登陸以後才會被執行的,so...

shell就做好自己的shell,不要去和系統搶1號程序號了

3樓:朱涵俊

第一次fork,脫離主程序。讓主程序退出,子程序繼續。呼叫setsid設定新環境。

而setsid只能子程序呼叫,不能組長呼叫。因此在第一次fork呼叫setsid。setsid之後子程序就成為組長了。

第二次fork,成為會話程序,擁有終端。如果直接第一次fork就擁有終端,那就不能開多終端了,不能多個shell同時執行了。

4樓:

這個問題問得有點詭異,你直接問為什麼 shell 不是 1 號程序不就行了嗎?

現在的系統 1 是預留好的,給 init 準備的。但 init 並不是核心的一部分,所以你又可以改成任何程式。核心的 init 引數就是幹這個的,例如 init="/bin/bash"。

何為 init 引數?

init= [KNL]

Format:

Run specified binary instead of /sbin/init as init

process.

作為 init 替代 /sbin/init。也就是說即使你要改成其它的,它至少能作為 init 使用。bash 或其它 shell 是 init 嗎?

所以它為何就得是 1 號程序?

5樓:fleuria

印象中 0 號程序是邏輯上的,為初始化第一次 fork 而生。

1 號程序是給類似 systemd 這樣的程序管理器而準備的,不過理論上直接跑 shell 應該也沒問題,這部分都是使用者態自己的事情不歸 kernel 管了。此外記憶中 1 號程序的乙個功能是一直跑 waitpid(),去捕獲沒有爹媽的子程序退出的殭屍程序,這個功能不屬於普通應用程式的範疇。

6樓:虛真

對於1號程序,它的執行的流程,我大體上是懂了的。但是呢,這個1號程序裡面還涉及了讀取檔案的操作。這個所讀取的檔案的具體內容是什麼,我並不清楚。

所以,核心是如何轉換到shell的,我並不清楚。

這樣一來,這個linux核心的執行,這個shell程式的執行,我目前是尚不清楚的。

7樓:駿馬金龍

pid=0的程序用於初始化核心並過渡,包括建立pid=1的init程序,初始化完成後控制權就交出去了。

pid=1的程序是使用者空間的總管程序,所以是使用者空間的程序理論上都由這個程序建立。

不過,如果是pid = 1的systemd程序,那systemd在核心啟動過程中,它還把手伸到了核心空間。

8樓:Bill Zhao

Linux或者說Unix程序,全部程序都是fork出來的,1是樹根,也負責接管孤兒程序(他的父程序死掉)成為他的子程序,

使用者空間的第乙個進出就是1, 我不知道0程序,麻煩指出位置!

微軟為什麼不給 Linux 出 Office?

在Linux下面為什麼就非得要用微軟的office呢?說穿了就只是排版的問題,不管用什麼office軟體,把模板定義好了,用啥不是一樣,最後匯出成pdf,列印的時候也沒有問題,至於常用的字型,自己安裝唄。換言之,微軟不出linux下的office,也可以理解成linux下的使用者不用office,或...

白雜訊的期望是0為什麼

很理解作者為什麼提出這個問題,確實存在不自恰的問題。如果白雜訊功率譜密度是常數,顯然0頻率上也是某個常數,這就說明均值不為零。但是,常數的傅利葉逆變換是衝擊函式,如果存在直流的隨機過程,自相關函式絕不是衝擊函式,至少是乙個常數 衝擊函式。這裡的不自恰,我想是這個特殊的衝擊函式引起的吧。即便是0均值的...

電子的質量數為什麼是0?

對於標誌核素的符號,左上角是質量數A,左下角是電荷數Z。對於原子核,電荷數Z的大小也等於質子數。對於電子,左上角的質量數是0,左下角的數是電荷數,不是質子數。 斥引量子 這是化學與物理學之間在對事物認知理解上的區別。因為化學理論的基礎是建立在原子 分子之上的。而對單獨的質子與電子的研究,都是屬於物理...