天天看點

4程序原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()



1fork()函數

子程序複制父程序的0到3g空間和父程序核心中的pcb,但id号不同。fork調用一次傳回兩次,有以下特點:

a:父程序中傳回子程序id

b:子程序中傳回0

c:讀時共享,寫時複制

2fork()依賴的頭檔案

#include <unistd.h>

3fork()函數說明:

pid_tfork(void);                           

通過該函數建立一個子程序

4案例說明:

4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()
4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()

總結:

a因為讀時共享和寫時複制,子程序會複制父程序的代碼,但是從fork下開始執行。但是,當在fork前定義父子程序都用到的變量的時候,這時候父子程序并不是同時操作這個變量,而是互相獨立的,也就是說:子程序指定自己的n,不會在父程序的n的基礎上操作。

5.getpid/getppid

a依賴的頭檔案

#include<sys/types.h>

b函數聲明

uid_t getuid(void);  

//傳回實際使用者id

uid_t geteuid(void); 

//傳回有效使用者id

c:案例說明

4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()
4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()

6.getuid()函數

#include <sys/types.h>

uid_t getuid(void);   

//獲得使用者id

uid_t geteuid(void);  

//獲得有效的使用者id

函數說明:

通過getuid()函數和geteuid()函數獲得使用者的id

案例說明:

4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()

運作結果:

4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()

7.getgid()函數

a:依賴的頭檔案

gid_t getgid(void);

gid_t getegid(void);

通過這個函數實作獲得組的id

c案例說明:

4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()
4程式原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork()

vfork

用于fork後馬上調用exec函數

父子程序,公用同一位址空間,子程序如果沒有馬上exec而是修改了父程序得到的變量值,此修改會在父程序中生效

設計初衷,提高系統效率,減少不必要的開銷

現在fork已經具備讀時共享寫時複制機制,vfork逐漸廢棄。