父進程創建一個子進程,並等待子進程結束;子進程調用execve啟動 使用shell的ps命令,查看系統當前的進程信息 #include <unistd.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; char* str; c ...
父進程創建一個子進程,並等待子進程結束;子進程調用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()。