在我們linux的學習中,有乙個很重要的概念就是程序, 程序就是**程式的乙個執行例項,是擔當分配資源的實體,是資源競爭的最小單位。簡單來說就是正在執行的程式。
我們在學習linux的時候,會發現有乙個規律就是管理者先將被管理者進行描述在組織起來。**對於程序來說,linux用一種來存放關於乙個程序的描述資訊,這個結構體就是pcb(process control block)
在linux中這個pcb就是task_struct這個結構體,這個pcb中包括程序的描述資訊有:
在剛剛的pcb我們提到了程序是有狀態的,程序一般有以下幾種形態
殭屍程序是乙個特殊的程序狀態,當子程序先於父程序退出而父程序沒有關心子程序的退出訊號所致,這個時候子程序已經退出可是並沒有父程序**子程序的資源所造成子程序變成殭屍程序
孤兒程序是由於父程序先於子程序退出,造成子程序退出的時候沒有程序替他**資源,孤兒程序一般被1號init程序領養,由一號程序替他**資源。
##建立程序
在linux下我們一般利用函式介面來建立程序
fork是核心提供的建立子程序的函式,函式原型是
pid_t fork(void)
子程序返回0,父程序返回子程序id,失敗返回0.我們一般在父程序中使用fork函式建立子程序
程序的建立步驟:
fork建立的子程序是利用寫詩拷貝技術,唯讀的時候不進行拷貝,只有進行寫操作的時候才進行拷貝操作
vfork函式與fork函式只有一點不一樣其他全部相同,vfork函式創立的子程序與父程序共用物理記憶體,在子程序進行操作的時候父程序進行阻塞等待,直到子程序退出父程序才能進行操作。
cpu資源分配是有先後順序的,優先順序高的先處理,我們可以將乙個程序的優先順序提高來讓cpu先處理這個程序。
我們一般在linux中由ps -l或ps aux來檢視程序
nice值就是對於程序優先順序的修正,一共-20到19共四十個級別,在linux中我們就是通過修改nice值來修改程序的優先順序。一般用rnice的命令來調整程序的優先順序
一般來說程序有以下推出場景
**執行完畢,正常推出,**執行完畢,結果不正確,**異常終止
在linux中一般有以下幾種方式退出程序
正常退出:
main函式退出,main函式一般是呼叫exit函式並且**資源返回返回值等
_exit退出:_exit函式是最暴力的一種退出方式,直接退出
exit推出:exit函式退出也呼叫了_exit函式,不過在呼叫以前做了以下幾件事
執行使用者通過atexit或on_exit定義的清理函式
關閉所有開啟的流,所有快取資料都被寫入
呼叫_exit
異常退出:
異常退出一般是由於核心向程序傳送退出訊號所致
ctrl+c 終止訊號
##程序等待
在之前我們提到,如果父程序不關係退出的子程序的話有可能形成殭屍程序,那麼如果我們有乙個函式讓父程序關注子程序的退出狀態那麼就可以避免產生殭屍程序
pid_t wait(int *status);
引數是獲取子程序退出狀態,不關心置空,成功返回子程序的程序id,失敗返回-1
pid_t waitpid(pid_t pid, int *status, int options);
pid:當pid=-1 等待任意乙個子程序當pid>0,等待程序id為pid的程序
status:wifexited若正常退出返回真 wexitstatus如不正常退出提取退出碼
options:wnohang若等待的子程序沒有結束就返回0,結束了返回程序id
我們建立的子程序基本與父程序相同,可是一般情況下我們不希望子程序與父程序執行相同的**,在linux下我們可以將另乙個程序與子程序進行程序替換,這樣子程序就可以做與父程序不同的事,程式替換的原理是頁表的重新對映。
linux給我們提供了六個不同的介面供我們進行程式替換操作
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …, char * const envp);
int execv(const char *path, char *const argv);
int execvp(const char *file, char *const argv);
int execvpe(const char *file, char *const argv,char *const envp);
呼叫這些函式成功的話下面的**將全部失效然後轉換成新的程序,失敗的返回-1,這六個函式看著不好分情,其實只要掌握規律就很好分情
l表示引數採用列表,v表示採用陣列,p表述自動搜尋環境變數,e表示自己維護環境變數。
事實上只有execve是系統呼叫介面,其他都是在execve上進行的封裝。
Linux下的程序
由系統自動建立 執行在核心態,是唯一乙個沒有通過 fork 或者 kernel thread 產生的程序 由 idle 通過 kernel thread 建立,在核心空間完成初始化後,進入使用者空間 進入使用者空間後啟動其他系統程序,最後變為守護程序監視系統其他程序。它是系統中所有使用者程序的父程序...
linux下的程序
一 程序的基礎 1 程式 程式是一些儲存在磁碟上的指令的有序集合 2 程序 程序是程式的一次執行過程 3 程序與程式的關係 程式是靜態的,程序是動態的 乙個程式可以對應多個程序 程式只有資料段和 段,程序除了有資料段和 段之外,還有堆和棧 關於程序 段 存放程式 bss段 存放未初始化的全部變數和靜...
linux下的deamon程序
設計乙個linux下的deamon程序,關鍵只有幾個 1.fork兩次。2.fork第一次和第二次之間成為程序組頭。3.改變工作目錄。4.忽略訊號。5.設定讀寫掩碼。一下是乙個從網路蒐集到的例程,非常好的演示了上述要點,存此備忘。上述程式在gcc4.0.1下編譯通過,在fc4 2.6.11下穩定執行...