父行程創建一個子行程,并等待子行程結束;子行程呼叫execve啟動
使用shell的ps命令,查看系統當前的行程資訊
#include <unistd.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; char* str; char* path="/bin/ps"; char* argv[5]={"ps","-a","-x",NULL}; if ((pid=fork())<0) //創建子行程 { printf("創建子行程錯誤\n"); exit(0); } else if(pid==0) { //以下為子行程代碼: printf("由子行程運行ps命令,以查看系統當前行程資訊,\n"); if (execve(path,argv,0)<0) //子行程執行ps命令檔案 { printf("子行程執行錯誤\n"); exit(0); } printf("子行程成功執行\n"); exit(0); //子行程結束 } // pid>0時繼續父行程執行(pid為子行程號): wait(); //父行程等待子行程結束 printf("父行程退出!\n"); exit(0); //父行程結束 }
函式說明:
- pid_t fork(void) :創建子行程,如創建成功,在父行程回傳子行程代碼,在子行程則回傳0,fork()創建的子行程與父行程運行于不同的地址空間,即父子各有獨立空間,但子行程會復制父行程的資源(如同一份代碼,打開檔案等等),父子行程之間的通信只能通過共享記憶體、訊息、管道等方式進行,
-
pid_t wait():暫停當前行程的執行,直到有信號來或者子行程結束,
-
void exit(int status):正常結束當前行程,并把引數status回傳給父行程
-
int execve(const char* filename,char* const argv[],char* const envp[])
執行引數filename字串所代表的檔案路徑,argv傳遞給執行檔案,envp為執行檔案需要的新環境變數,如執行檔案能成功執行則函式不會回傳,執行失敗回傳-1, -
pid_t vfork(void):創建子行程,vfork()不同fork(),vfor()創建的子行程與父行程共享同一地址空間,即子行程完全運行在父行程的地址空間上,子行程對虛擬地址空間任何資料的修改,父行程可見,但父行程創建子行程之后,父行程會被阻塞,直到子行程執行exec()或exit(),
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/131378.html
標籤:Linux
下一篇:作業系統-核心級執行緒實作
