进程的基本概念
参考小何讲进程
环境变量
Linux是多任务多用户的开源操作系统。环境变量:操作系统中用来制定操作系统运行环境的一些参数。通常具有以下特征:
1、字符串
2、统一的格式 名=值[;值]
3、用来描述进程环境信息
常见的环境变量
PATH:可执行文件的路径
输出方式 echo $PATH
SHELL:记录当前目录解析器
HOME:当前home目录
LANG:语言
TERM:终端类型
注意:要在C语言程序中使用环境变量,必须extern char **environ;
环境变量操作函数
getenv函数
作用:获取环境变量值
头文件
#include <stdlib.h>
函数原型
char* getenv(const char* name)
char* secure_getenv(const char* name) _GNU_SOURCE
setenv函数
作用:设置或添加环境变量值
头文件
#include <stdlib.h>
函数原型
int setenv(const char* name,const char* value, int overwrite)
overwrite:
非0 改变
0 不改变
int unsetenv(const char* name)
进程控制
fork函数
作用:创建子进程
头文件
#include <unistd.h>
函数原型
pid_t fork(void)
返回值:
1、返回子进程ID >0 (父进程)
2、0 创建成功 (子进程)
getpid/getppid函数
作用:得到当前进程的ID号
头文件
#include <sys/types.h>
#include <unistd.h>
函数模型
pid_t getpid(void)
pid_t getppid(void)
注意:父子进程之间共享的只有文件描述符与mmap建立的映射区
exec函数族
调用exec函数不会创建新进程。
int execl(const char* path, const char* arg,...)
作用:加载一个进程,通过路径名
path:路径
arg:参数
int execlp(const char* file, const char* arg,...)
作用:加载一个进程,借助PAYH环境变量,通常用来执行系统命令如ls,cat
返回值:-1,失败;
无返回,成功
参数file:要加载的程序的名字
参数arg:argv[0]程序名
最后一定要加 NULL 参数
int execle(const char* path, const char* arg,...,char* const envp[])
需使用环境变量
int execv(const char* path, char * const argv[])
int execvp(const char* file,char* const argv[])
int execve(const char * path, char* const envp[])
回收子进程
孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程
僵尸进程:进程终止,父进程尚未回收,子进程残留资源放于内核,变成僵尸进程。不能用kill终止僵尸进程。
wait函数
作用
1、阻塞等待子进程退出
2、回收子进程残留资源
3、获取子进程结束状态
头文件
#include <sys/types.h>
#include <sys/wait.h>
函数原型
pid_t wait(int *status);
status:传入参数,保存子进程的退出状态
1、WIFEXITED(status) 非0 进程正常结束
WEXITSTATUS(status) 获取进程退出状态
2、WIFSIGNALED(status) 非0 进程异常终止
WTERMSIG(status) 取得使进程终止那个信号的编号
3、WIFSTOPPED(status) 非0 进程处于暂停状态
WSTOPSIG(status) 取得使进程暂停的那个信号的编号
WIFCONTINUED(status) 真 进程暂停后已经继续执行
返回值:>0 清理掉的子进程ID
-1 失败
pid_t waitpid(pid_t pid, int* status ,int options)
作用:同wait 但可以指定pid进程清理,可以不阻塞
pid:
>0 回收指定进程
-1 回收所有进程 相当于wait
0 回收和调用waitpid一个组的所有子进程
<-1 回收指定进程组内的任一子进程
返回0:参数3为WNOHANG,且子进程正在运行