通过上一篇文章进行进程的基础讲解,本文将带大家进行进程的进阶讲解及应用。
首先为大家引出两个问题?何为僵尸进程,僵尸进程如何产生的?
僵尸进程:
- 进程执行结束,空间没有被回收
僵尸进程如何产生:
- 子进程运行结束,父进程没有回收子进程空间
僵尸进程就像进程的名字一样肯定是不好的一个名字,空间没有被回收就会被占用,从而影响性能,我们当然是想要避免以上状况的产生,那么:
孤儿进程相对于僵尸进程来说不会产生未被占用的空间,是我们比较理想的一种情况,另一种方法运用wait函数则是我们今天想要介绍的重点。
函数接口:wait
- pid_t wait(int *status);
功能:
- 回收子进程空间
参数:
- status: 进程退出时候的状态,如果不关心其退出状态一般用NULL表示,如果要回收进程退出状态,则用WEXITSTATUS回收。
返回值:
- 成功返回回收到子进程的PID
- 失败返回-1
函数接口:waitpid
- pid_t waitpid(pid_t pid, int *status, int options);
功能:
- 回收指定进程的资源,和wait功能相似,比wait更灵活
参数:
pid:
- <-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)
- -1 回收任意子进程,组内外
- 0 回收和当前调用waitpid一个组的所有子进程,组内
- > 0 回收指定ID的子进程
status:
- 子进程退出时候的状态。
- 如果不关注退出状态用NULL。
options 选项:
- 0 表示回收过程会阻塞等待。
- WNOHANG 表示非阻塞模式回收资源。
返回值:
- 成功 返回接收资源的子进程pid
- 失败 -1
- 设定为非阻塞且没有回收到子进程返回0
函数接口:exec函数簇
exec函数簇分为两大类:execl与execv函数类
以上两段代码均为执行ls -l 的文件命令,execl为列表形式查询,execv为指针数组传参方式传递指令
功能:
- 利用进程空间执行另外一段代码(执行完不返回原进程)
参数: (搭配execl与execp使用)
- p:在系统路径下找要执行的代码
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);
返回值:
- 成功无法返回
- 失败返回-1
函数接口:system
int system(const char *command);
功能:
- 使用该函数可以将shell命令直接在代码中执行。
参数:
- command要执行的shell命令
以上就为作为第一章进程的内容的一个补充,并且进程的结束,下一章节将为大家进行线程的介绍,希望大家多多关注,并且对于文中的内容可以指正与补充,让我们在评论区多多交流!谢谢大家支持