Unix/Linux 那些系統啟動后的進程


閑扯

什么時候開始有“UNIX/LINIX”這一詞匯,我忘了?只知道它是一個操作系統,跟dos一個級別的?!也就停留在這個概念的層次上,所以很多對我來說都是迷。UNIX也走過了40多個年頭的路程,而它的每一個組織不斷得到改進;21世紀開源勢頭正猛,前進的步伐更快了!

正文

眼過千邊,不如收過一遍!以下結論來自apue、互聯網或者些許自己的理解,實踐環境:Linux 2.6。

當內核加載完成之后,會創建init進程,它是系統的第一個進程init。init進程ID為1,也因此它是之后所有進程的“祖宗”!init進程是系統進入了多用戶的狀態,允許多個終端設備登錄(tty1,tty2...)。對於每一個終端設備,init進程調用一次fork生成一個子進程,緊接着調用exec執行getty程序。

下面的文件是/ect/init/tty1.conf,這足以說明init的動作。

image_thumb.png

getty進程所要做的:

  1. open:調用open打開輸入輸出(fd為0,1,2的文件);
  2. read:輸出“hostname login:”提示信息,接着讀取用戶輸入的用戶名;
  3. exec:根據用戶名和從文件中讀入的初始環境調用exec,實際上是execle。

現在,getty完成它的使命,把現場交給(exec)login進程。login做的事情可多啦:

  1. 提示用戶輸入密碼兵營驗證密碼;如果驗證多次不成功,又把現在交給init,init知道子進程被XX了,接下來的事情跟上面的一樣;
  2. 驗證成功的話,設置當前工作目錄
  3. 更改終端所有者
  4. 對終端的權限改為讀與寫
  5. 設置進程組ID
  6. 設置起始目錄(HOME),shell(SHELL),用戶名(USER和LOGNAME),系統默認路徑(PATH)

login已完成使命(主要是以上步驟),shell登場(exec)。

  1. 登錄shell的文件描述符0、1、2設置為終端設備
  2. 讀取用戶啟動文件(我用的是ubuntu 12,內核是Linux,用的GNU bash,它用的啟動文件是起始目錄下的.profile),執行初始化操作
  3. 等待用戶鍵入命令

根據上面的第二條:

image_thumb.png

我在.profile第九行添加“Daoluan Logins In Succeed!”,在進入命令提示符的前一行,就有顯示這一字符串,說明這是初始化的必經之地。經常我們需要自定義我們的工作環境的時候,通常要在工作目錄下的.bashrc(在.profile文件里有一個行執行.bashrc的代碼),從而達到自定義環境的目的。

用apue上一幅圖來結束這篇學習總結!

image_thumb.png

上面是終端登錄的過程;網絡登錄的話,會有偽終端設備驅動程序,配合talnet來對終端進行仿真。

歡迎斧正!

本文完 2012-07-13

搗亂小子 http://www.daoluan.net/blog/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM