pid_t fork(void);
1、從父進程複製出子進程,進程控制塊內容相同,用戶態代碼和數據也相同;
2、父進程返回子進程ID(父進程唯一能得到子進程ID的時刻),子進程返回0;
3、返回後父進程與子進程的運行順序不確定,由調度程序確定;
4、父進程打開的描述符都被複制到子進程中,子進程不集成父進程的鎖。
pid_t vfork(void);
與fork基本相同,有兩處顯著差異:
1、子進程沒有複製出一套自己的數據空間與堆棧信息,子進程中的改變也會影響父進程;
2、vfork後先運行子進程,父進程此時阻塞;當子進程執行exit或exec函數後父進程才能繼續執行;
exec
exec是一系列函數,分爲execl/execlp/execle/execv/execvp/execve六種
1、實質上前五種都是對execve的某種形式的封裝,只有execve是系統調用
2、exec並不創建新的進程,只是用另一個程序替換了當前進程的正文、數據、堆棧段;因此進程ID不會改變。
3、調用exec成功則加載新的程序從起始代碼開始執行,不會返回到原程序中;當調用出錯時纔有返回值,爲-1;
system
集成了fork、exec、wait的功能並添加了響應的錯誤處理,缺點是不能控制fork出子進程的運行權限;