1. 进程等待
- 父进程等待子进程退出,获取退出子进程返回值,释放退出子进程资源。
· 避免产生僵尸进程。
· wait/waitpid :只要有已经退出的子进程,则会直接处理,不需要等待。
· 头文件 #include <sys/wait.h> pid_t wait(int *status);
· 默认是阻塞接口
· 等待任意一个子进程退出,通过status获取退出返回值,释放资源。返回值–成功返回退出子进程的pid,错误返回-1.pid_t waitpid(pid_t pid, int *status, int options);
· 默认是阻塞接口
· 等待任意一个子进程退出,也可以等待指定的子进程退出;可以阻塞等待子进程退出,也可以非阻塞等待子进程退出。
· pid:-1等待任意子进程;大于0等待指定子进程- waitpid – 返回值:使用低16位,其中高8位返回值,低7位异常退出信号;
· WIFEXITED(status) – 判断;WEXITSTATUS(status) – 获取。
· 成功返回值大于0,没有子进程退出返回0, - options:0 - 默认阻塞;WNOHANG - 非阻塞
· 阻塞:为了完成一个功能,发起一个调用,若功能完成条件不具备,一直等待
· 非阻塞:为了完成一个功能,发起一个调用,若功能完成条件不具备,立即报错返回
2. 程序替换
- 替换一个进程正在调度运行的程序
· 加载一个新的程序到内存中,更新当前进程的页表映射信息到新的程序上。 - exec函数族:5个库函数+系统调用接口
· 三类参数:新的程序路径名称;程序运行参数;自己设定环境变量。
-
execl和execv的区别:程序运行参数的不同设置方式。
·execl("/bin/ls","ls","-a","-l",NULL);
·char* argv[]={"ls","-a","-l",NULL}; execv("/bin/ls",argv);
-
execl和execlp的区别:新的程序是否需要带路径,指定程序所在位置
·execl("/bin/ls",...);
·execlp("ls",...);
--原因:会到PATH环境变量指定的路径下去找对应程序 -
execl和execle的区别:当前进程的环境变量是否由自己来设置
·execl("/bin/ls",...)
--使用默认当前就有的环境变量
·char *env[] = {"MYVAL=100",NULL}; execle("/bin/ls")