本期主要分享的是进程中进程回收以及获得环境变量的相关接口,比如wait,waitpid,getenv,setenv等,能够使得我们更好的使用进程做我们想做的事情!
进程回收:
1.僵尸态:
进程代码执行结束,但空间没有被回收
2.僵尸进程产生的原因:
子进程先结束,父进程没有回收子进程空间,子进程会成为僵尸进程
3.如何避免产生僵尸进程:
1.子进程结束父进程回收子进程空间
2.让父进程先结束,子进程会成为孤儿进程,孤儿进程父进程为系统指定的进程,
该孤儿进程结束,会被系统进程回收空间
4.孤儿进程:
父进程先结束,子进程会成为孤儿进程,会被系统指定的进程收养
5.wait和waitpid
(1)wait
pid_t wait(int *wstatus);
功能:
回收子进程空间,避免子进程进入僵尸态
参数:
wstatus:存放子进程结束状态空间的首地址
参数传NULL时,只会回收进程空间;
返回值:
成功返回回收到的子进程的PID
失败返回-1
并且无子进程时会直接返回,有子进程时会阻塞等待回收;
WIFEXITED(wstatus)
判断进程是否正常结束
WEXITSTATUS(wstatus)
获得进程正常结束的值
WIFSIGNALED(wstatus)
判断进程是否被信号杀死
WTERMSIG(wstatus)
获得杀死进程的信号
wait函数具有阻塞功能
(1)能够实现回收子进程空间
(2)能够实现父子进程任务的同步
同步:具有先后执行的逻辑顺序关系;
异步:不具有先后的顺序关系;
(2)waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
回收子进程空间
参数:
pid:
< -1:回收子进程进程组ID与传入pid绝对值相同的子进程空间
==-1:回收任意一个子进程
==0 :回收子进程进程组ID与调用函数的PID值相同的进程
> 0 :回收子进程PID与传入PID相同的子进程空间
wstatus:存放子进程结束状态空间的首地址
options:
WEXITED:等待子进程结束
WNOHANG:不阻塞
0:阻塞回收
返回值:
成功返回回收到子进程的PID
失败返回-1
如果WNOHANG被设置,没有回收到结束的子进程返回0
注意: 不仅会回收结束进程,也会接收改变状态的进程;
相同点:
wait(&status);等价于waitpid(-1, &status, 0);
不同点:
1.waitpid可以实现非阻塞回收
2.waitpid可以回收指定的子进程空间
6.exec函数族(fork + exec是操作系统经常使用的在一个进程中启动新的进程的方法,包括linux中的很多进程都在使用这个方法,比如在终端执行a.out)
(1)int execl(const char *path, const char *arg, ...);
(2) int execlp(const char *file, const char *arg, ...);
(第一个参数可以只传文件名字,不要路径,但必须环境变量中要有,什么时候用l和p取决于是不是系统相关的目录,lp一般用于系统相关的目录的可执行文件)
(3) int execle(const char *path, const char *arg, ...);
(4) int execv(const char *path, char *const argv[]);(传参时可以使用指针数组进行传递)
(5) int execvp(const char *file, char *const argv[]);
(6) int execvpe(const char *file, char *const argv[],char *const envp[]);
l:参数以列表形式传递
v:参数以指针数组形式传递
p:在系统环境变量PATH对应的目录中找该文件
e:执行新代码时更新环境变量信息
execl:
功能:
利用进程空间执行一段新代码
参数:
path:执行代码的路径(绝对路径或者相对路径)
arg:传入参数(第二个参数一般为标识符,与第一个路径中要执行的文件名相同,最后一个参数为NULL,其实就相当于在终端运行代码时的传参顺序)
返回值:
成功不会返回
失败返回-1
7.环境变量相关函数接口:
(1)getenv
char *getenv(const char *name);
功能:
通过环境变量名获得该环境变量的值
参数:
name:环境变量名
返回值:
成功返回环境变量的值
失败返回NULL
(2)setenv
int setenv(const char *name, const char *value, int overwrite);
功能:
设置环境变量的值
参数:
name:环境变量名
value:环境变量的值
overwrite:
非0值 覆盖
0值 不覆盖
返回值:
成功返回0
失败返回-1
8.system
int system(const char *command);
功能:
执行一条command shell命令
参数:
command:命令字符串首地址
返回值:
成功返回0
失败返回-1