4進程原語:fork()函數,getpid()函數和getppid()函數,getuid()函數,getgid()函數,vfork(),getpidgetppid
1fork()函數
子進程複製父進程的0到3g空間和父進程核心中的PCB,但id號不同。fork調用一次返回兩次,有以下特點:
A:父進程中返回子進程ID
B:子進程中返回0
C:讀時共用,寫時複製
2fork()依賴的標頭檔
#include <unistd.h>
3fork()函數說明:
pid_tfork(void);
通過該函數建立一個子進程
4案例說明:
總結:
A因為讀時共用和寫時複製,子進程會複製父進程的代碼,但是從fork下開始執行。但是,當在fork前定義父子進程都用到的變數的時候,這時候父子進程並不是同時操作這個變數,而是相互獨立的,也就是說:子進程指定自己的n,不會在父進程的n的基礎上操作。
5.getpid/getppid
A依賴的標頭檔
#include <unistd.h>
#include<sys/types.h>
B函式宣告
uid_t getuid(void); //返回實際使用者ID
uid_t geteuid(void); //返回有效使用者ID
C:案例說明
6.getuid()函數
A依賴的標頭檔
#include <unistd.h>
#include <sys/types.h>
B函式宣告
uid_t getuid(void); //獲得使用者id
uid_t geteuid(void); //獲得有效使用者id
函數說明:
通過getuid()函數和geteuid()函數獲得使用者的id
案例說明:
運行結果:
7.getgid()函數
A:依賴的標頭檔
#include <unistd.h>
#include <sys/types.h>
B函式宣告
gid_t getgid(void);
gid_t getegid(void);
函數說明:
通過這個函數實現獲得組的id
C案例說明:
運行結果:
vfork
用於fork後馬上調用exec函數
父子進程,公用同一地址空間,子進程如果沒有馬上exec而是修改了父進程得到的變數值,此修改會在父進程中生效
設計初衷,提高系統效率,減少不必要的開銷
現在fork已經具備讀時共用寫時複製機制,vfork逐漸廢棄。
linux下建立進程的問題,fork函數與getpid函數使用,程式運行結果與預期不同、
getppid 和 getpid 都是一個函數。
函數調用是要加括弧的 getppid()
printf("im a child process,parent PID num is %d\n",(int)getppid);
返回的只是getppid這個函數的記憶體位址。
printf("im a child process,parent PID num is %d\n",(int)getppid());
才能返回ppid
getpid()與getppid()在父進程中可以運行
可以,getpid()得到本身進程id,getppid()得到父進程進程id,如果已經是父進程,得到系統進程id,如bash環境運行得到bash的id