傳統的linux模型裡有三種建立或者修改程序的操作:
–system用於呼叫shell,執行乙個指定的命令;
–fork用於建立乙個新的程序,該程序幾乎是當前程序的乙個完全拷貝;
–exec可以在程序中用另外的程式來替換當前執行的程序;
什麼是程序?
–程序是乙個正在執行的程式例項,他也是linux基本的排程單位,乙個程序由如下元素組成
–程序的當前上下文(context),它是程序當前執行狀態。
–程序的當前執行目錄;
–程序訪問的檔案和目錄
–程式的訪問許可權
–記憶體和其他分配給程序的系統資源
核心使用程序來控制對cpu和其他系統資源的訪問,並且使用程序來決定在cpu上執行哪個程式,執行多久以及採用什麼特性執行它。
核心的排程器負責在所有的程序間分配cpu時間,稱為時間片,它輪流在每個程序分的時間片用完後從程序那裡搶回控制權。
時間片非常小,小到讓系統上的幾個程序彷彿是在同一時間執行一樣。
每個程序還包含了有關它們自身的充分資訊,必要的時候核心能在執行與不執行它之間進行切換。
程序具有許多能唯一定義它們的屬性和特性。
程序的屬性或特性能夠把它們標識出來並且規定它們的行為。
linux核心維護了關於每個程序的大量資訊,並且對外提供乙個訪問這些資訊的介面。
程序標識號。
–程序最知名的屬性就是程序號(processid,pid)和它父程序號(parent processid,ppid)。
pid和ppid都是非零的整數。
乙個pid唯一標識乙個程序。
乙個程序建立的另乙個新程序稱為子程序。相反地,建立子程序的程序稱為父程序。
所有程序追溯其祖先最終都會落到程序號為1的程序身上,這個程序叫init程序
–init程序是linux核心啟動後第乙個執行的程序。
–init引導系統,啟動守護程序並且執行必要的程式。
為什麼要知道乙個程序的pid以及它父程序的pid呢?。
–pid常見的用法之一就是建立唯一的檔案或目錄名。
–另一種的用途是把pid寫入日誌檔案做為日誌訊息的一部分。
得到pid和ppid的例子
int main(void)
printf("pid=%d\n", getpid());
printf("ppid=%d\n",getppid());
return exit_success;
雖然計算機用數字工作挺好,但普通人甚至程式設計師還是感到使用名字更舒服一些。幸運的是有兩種方法能把uid轉換為人可讀的名字。
getlogin函式返回執行程式的使用者登入名。
可以把登入名作為引數傳遞給getpwnam函式,這個函式能返回/etc/passwd檔案中與該登入名相應的一行完整資訊。
#include
struct passwd *getpwnam(const char *name);
name必須是乙個指向包含使用者名稱的字串指標。
getpwnam返回乙個指向passwd結構的指標。
int main(void)
char *login = getlogin();
struct passwd *ps = getpwnam(login);
printf("user name=%s\n", ps->pw_name);
printf("uid=%d\n", ps->pw_uid);
printf("home dir=%s\n", ps->pw_dir);
return exit_success;
複製去google翻譯
Linux程序 核心模型
核心必須實現一組服務和相應的介面,應用程式則可以使用這些介面,而不是直接與硬體打交道。linux核心主要由以下5個子系統組成 程序排程 記憶體管理 虛擬檔案系統 程序間通訊以及裝置驅動。在這個組成中,最核心的就是程序管理 程序排程和程序間通訊。在linux系統中,我們編寫的任何應用層程式,不管是上層...
Linux網路程式設計多程序模型
include include include include include include include define serv port 8080 define maxline 100 define maxsize 4096 void sys error const char fun str...
Nginx程序模型
這篇主要是閱讀這篇博文的筆記。nginx採用的也是大部分http伺服器的做法,master,worker模型,基本的事件處理都是放在worker中,master負責一些全域性初始化,以及對worker的管理。nginx中的master和worker之間是通過socketpair來實現的,每次fork...