linux系統的程序建立時區別於其他的系統的,它並沒有提供spawn機制。而是把乙個程序的建立分成了兩步:fork和exec();先建立乙個程序,再讓子程序執行新的程式。
首先系統呼叫fork()函式,若呼叫成功則產生乙個新的程序,值的一提的是該函式會產生兩個返回值。當父程序呼叫的時候返回0,子程序呼叫的時候返回子程序的id.linux系統執行該函式產生新的程序較其他系統效率要高,因為它採用了copy-on-write(寫時拷貝)進製。也就是linux系統並不是在新的程序產生的同時就立即去拷貝乙份父程序的空間。而是當需要寫入得時候才會去複製。這樣fork()的實際開銷就是 複製父程序頁表及建立唯一的程序描述符。當有新的資料寫入得時候,子程序才會拷貝自己單獨的資料和堆疊區。這裡值得一提的是vfork()函式,次函式不會複製父程序的頁表項,並且執行在父程序的空間中的,可以說是專為後面的exec()金蟬脫殼準備的。vfork()執行 會讓父程序堵塞直到其exit()或exec()其他程式。
但通常我們並不是要子程序執行像父程序那樣的程式,而是要執行新的程式。這時候我們就要用到exec*()庫函式了。exec()函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容。產生新的**,資料,堆疊段。次函式呼叫成功不返回,失敗返回-1.
#includeint 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 execve(const char *path, char *const argv, char *const envp);
下面是乙個例項:
/* exec.c */#include
main()
;char *argv_execv=;
char *argv_execvp=;
char *argv_execve=;
if(fork()==0)
if(execl("/bin/echo", "echo", "executed by execl", null)<0)
perror("err on execl");
if(fork()==0)
if(execlp("echo", "echo", "executed by execlp", null)<0)
perror("err on execlp");
if(fork()==0)
if(execle("/usr/bin/env", "env", null, envp)<0)
perror("err on execle");
if(fork()==0)
if(execv("/bin/echo", argv_execv)<0)
perror("err on execv");
if(fork()==0)
if(execvp("echo", argv_execvp)<0)
perror("err on execvp");
if(fork()==0)
if(execve("/usr/bin/env", argv_execve, envp)<0)
perror("err on execve");
}
程式裡呼叫了2個linux常用的系統命令,echo和env。echo會把後面跟的命令列引數原封不動的列印出來,env用來列出所有環境變數。
由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出--各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。
編譯並執行:
$ cc exec.c -o exec$ ./exec
executed by execl
path=/tmp
user=lei
status=testing
executed by execlp
excuted by execv
executed by execvp
path=/tmp
user=lei
status=testing
linux中程序的狀態
1.使用命令 top c 來檢視程序狀態 redhat localhost top c r工作中的程序 s可中斷的睡眠狀態 i空閒狀態 idle o程序正在處理器執行 b程序正在等待更多的記憶體頁 d不可中斷的睡眠狀態 t暫停狀態或跟蹤狀態 x出狀態,程序即將被銷毀 z殭屍程序1 task runn...
python中程序的幾種建立方式
摘自 在新建立的子程序中,會把父程序的所有資訊複製乙份,它們之間的資料互不影響。該方式只能用於unix linux作業系統中,在windows不能用。1 importos2 3 注意,fork函式,只在unix linux mac上執行,windows不可以 4 pid os.fork 5 子程序永...
linux中程序的使用者管理
每個程序都擁有真實的使用者 組 uid gid 有效的使用者 組 euid egid 儲存的設定使用者 組 suid sgid 還有linux中專門用於檔案儲存訪問的使用者 組id fsuid fsgid對於unix系統沒有這兩個fields 現說明程序中每種型別使用者的功能 1 真實的使用者 組 ...