程序號
每個程序初始化時,系統都分配乙個id號,用來標識程序,具有唯一性。
getpid()函式
#include #include pid_t getpid(); // 獲取當前程序id
pid_t getppid(); // 獲取父程序id
通過命令 ps -x |grep 程序號, 可查詢該程序。
程序複製fork()
#include #include pid_t fork(); // 成功返回程序號,失敗返回-1;
特點:執行一次,返回兩次,在父程序中返回子程序的程序id號,子程序返回0;
system()方式
system()函式呼叫 "/bin/sh-c command"執行特定的命令,阻塞當前程序直到command命令執行完畢。
#include int system(const char* command);
執行system()函式時,會呼叫fork 、execve、waitpid等函式,其中任意乙個呼叫失敗將導致system()函式呼叫失敗,system()函式的返回值:
失敗 -1
當sh不能執行時,返回127,
成功返回程序狀態值。
exec()族函式
fork()和system()函式執行時,系統都會建立乙個新的程序,執行呼叫者的操作,原來的程序還會存在,知道顯示退出,而exec()族的函式會用新程序代替原有的程序,系統會從新程序執行,新程序pid值同原來程序一致。
exec()族函式:
#include extern char **environ;
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,const char *arg);
int execvp(const char* file,const char *arg);
使用exec()普遍的一種用法是先使用fork()函式分叉程序,然後再新的程序中呼叫exec()函式,這樣exec() 占用與原來一樣的系統資源來執行。
在fork系統呼叫之後進行exec()系統呼叫,系統就不回進行系統複製,此方法叫做寫時複製,即只有在造成系統的內容發生更改的時候才進行程序的真正更新。
初始程序init.
pstree 檢視系統中執行的程序間的關係。
防止殭屍程序的產生
apue的 直接貼這裡。這段 採用了兩次fork,來避免產生殭屍程序。當乙個程序的父程序先退出,該程序就由init程序接管。init程序就成為了該程序的父程序 該程序退出時,有init來清理。所以該程序就不會成為殭屍程序了。include include include include intmai...
殭屍程序的產生原因
在linux系統中,殭屍程序是已經執行完畢,但是沒有被父程序 的子程序。判斷殭屍程序的乙個方法是使用ps命令檢視程序狀態。如果程序狀態是z,說明這是乙個殭屍程序。在多程序的程式中,父程序會啟動若干個子程序來處理任務。當子程序退出後,除了在程序表中占用的乙個程序表項,子程序所使用的資源 檔案描述符 記...
產生守護程序的方法
1 在父程序下產生子程序。2 關閉父程序,使子程序成為乙個新會話的頭程序和新程序組的頭程序,從而與父程序所在的程序組和會話脫鉤。3 忽略sighup訊號,防止之後新產生的程序被關閉。4 在子程序下 後面我們稱這個子程序為父程序sp 再產生子程序,使之成為守護程序。這樣做的原因是如果這時開啟乙個控制終...