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函数来看一下。