1,函數原型爲:pid_t fork();調用一次返回兩次,返回調用進程的pid號。
pid_t pid;
pid=fork();
如果pid>0,則是子進程的進程號,說明此時調用進程是父進程;如果返回是0,則說明此時調用進程是子進程,若<0,則說明fork()出錯。
因爲讀時共享和寫時複製,子進程會複製父進程的代碼,但是從fork下開始執行。但是,當在fork前定義父子進程都用到的變量的時候,這時候父子進程並不是同時操作這個變量,而是相互獨立的,也就是說:子進程指定自己的n,不會在父進程的n的基礎上操作。
pid_t getpid(void);返回調用進程的pid號
pid_t getppid(void);返回調用進程的父進程的pid號
依賴的頭文件#include <unistd.h> #include<sys/types.h>
uid_t getuid(void); 返回實際用戶ID
uid_t geteuid(void); 返回有效用戶ID
gid_t getpid(void);返回實際用戶組ID
gid_t getepid(void);返回有效用戶組ID
2,exec
加載新的程序來替換當前進程的代碼段和數據段。
int execl(constchar *path, const char *arg, ...);
int execlp(constchar *file, const char *arg, ...);
int execle(constchar *path, const char *arg, ..., char * const envp[]);
int execv(constchar *path, char *const argv[]);
int execvp(constchar *file, char *const argv[]);
int execvpe(constchar *file, char *const argv[], char *const envp[]);
l 命令行參數列表
p 搜素file時使用path變量
v 使用命令行參數數組
e 使用環境變量數組,不使用進程原有的環境變量,設置新加載程序運行的環境變量
3,wait/waitpid
殭屍進程: 子進程退出,父進程沒有回收子進程資源(PCB),則子進程變成殭屍進程
孤兒進程: 父進程先於子進程結束,則子進程成爲孤兒進程,子進程的父進程成爲1號,進程init進程,稱爲init進程領養孤兒進程
依賴的頭文件 #include <sys/types.h> #include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
如果不需要知道具體出錯原因,就傳wait(NULL),
pid:
<-1 回收指定進程組內的任意進程
-1 回收任意子進程
0 回收和當前調用waitpid一個組的所有子進程
>0 回收指定ID的子進程
options:
WNOHANG 非阻塞
具體如果不會用,不知道如何傳參就用man函數來看一下。