獲得進程ID: #include<sys/types.h> #include<unistd.h> pid_t getpid(void) //pid_t是一個int型 Linux是復制進程而不是創(chuàng)建進程,,有兩個函數(shù)fork()和clone(),,區(qū)別是前者是全部復制,,后者是選擇復制,。fork()和vfork()的區(qū)別是前者是全部復制,后者是只復制task_struct和系統(tǒng)堆棧,。即前者是獨立的內(nèi)存,,后者是共享的內(nèi)存。 fork(): #include<sys/types.h> #include<unistd.h> pit_t fork(void) 若創(chuàng)建成功,,在父進程中返回子進程ID,,在子進程中返回0。若出錯則返回-1,。 fork之后,,子進程和父進程都從調(diào)用fork函數(shù)的下一條語句開始執(zhí)行。如下代碼: pid_t pid=fork(); if(pid==-1) //出錯 { printf("Error in fork!"); exit(1);
} else if(pid==0) { //子進程中; } else //父進程中 大部分復制出來的進程一定會與父進程分道揚鑣,,執(zhí)行自己的程序,。那么就要使用exec函數(shù)族其中包括了execl、execlp,、execle,、execv、execvp,、execve 6個函數(shù),。 進程的消亡: 有兩個方式:一種是自然退出,exit()和_exit(),。第二種是異常終止,,abort()。 exit():立刻終止,,清除所有數(shù)據(jù)結構,。 #include<stdlib.h> void exit(int status) _exit(): #include<unistd.h> void _exit(int status) 區(qū)別:exit()會首先執(zhí)行一些文件關閉操作 進程調(diào)用了exit和_exit之后并非立刻消失,而是留下一個僵尸進程的數(shù)據(jù)結構,,可以用wait和waitpid來處理,。 #include<sys/types.h> #include<sys/wait.h> pid_t wait(int* status) status用來收集進程退出的狀態(tài)(若不需要則置為NULL),若成功則返回等待進程的ID,,若失敗則返回-1,。 進程一旦調(diào)用了wait,,會立即阻塞自己。由wait自動分析是否當前進程的某個子進程已經(jīng)退出,,如果讓他找到這樣的一個已經(jīng)變成僵尸進程的子進程,,wait就會手機這個子進程的信息,并把它徹底銷毀后返回,,如果沒有找到這樣的一個子進程,,則wait會一直阻塞在這里,知道出現(xiàn)一個為止,。 如下代碼: pid_t pid=fork(); if(pid==-1) //出錯 { printf("Error in fork!"); exit(1); } else if(pid==0) { //子進程中; } else { pid_t pWait=wait(NULL); //等待子進程 }waitpid: #include<sys/types.h> #include<sys/wait.h> pid_t waitpid(pid_t pid,int* status,int options)pid取值 含義 pid>0 只等待進程ID為pid的子進程,,不管其他已經(jīng)有多少子進程運行 結束退出,只 要指定的子進程還沒有結束,,則waitpid就一直等待下去,。 pid=-1 等待任何一個子進程退出,沒有任何限制,,此時等價于wait pid=0 等待同一個進程組中的任何子進程,,如果某一個子進程已經(jīng)加入了別的進程 組,則waitpid不會對它有任何理睬 pid<-1 等待一個定制進程組中的任何子進程,,這個進程組的ID等于pid的絕對值 options目前只支持WNOHANG和WUNTRACED兩個選項 如下代碼: pid_t pid=fork(); if(pid==-1) //出錯 { printf("Error in fork!"); exit(1); } else if(pid==0) { //子進程中; } else { pid_t pWait=waitpid(pid,NULL,WNOHANG); //參數(shù)WNOHANG表示不會等待子進程,,若沒有已退出的子進程則直接返回0 }abort():會產(chǎn)生一個core dumped文件 #include<stdlib.h> void abort(void) system(): #include<stdlib.h> int system(const char* cmdstring) 執(zhí)行system時會調(diào)用fork、exec,、waitpid,,因此有三種可能的返回值。 -1 fork失敗或者waitpid返回出來EINTR之外的錯誤 127 exec失敗若都成功則返回shell的終止狀態(tài) 若cmdstring為NULL則表示僅當命令處理程序可用時返回非0,??捎糜跍y試給定的操作系統(tǒng)上是否支持system函數(shù)。 |
|
來自: sky_feiyang > 《Linux》