Linux系统编程-进程控制
2021/6/12 7:36:23
本文主要是介绍Linux系统编程-进程控制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
基本概念
程序和进程
- 程序:编译好的二进制文件,占用磁盘空间,静态
- 进程:程序的运行过程,占用内存、CPU等,动态
并行和并发
- 并行:一边吃饭一边看电影,这就是并行
- 并发:在一个时间段内, 是在同一个cpu上, 同时运行多个程序。如:若将CPU的1S的时间分成1000个时间片,每个进程执行完一个时间片必须无条件让出CPU的使用权,这样1S中就可以执行1000个进程。简单来说就是可以先暂停吃饭去看电影,再暂停看电影去吃饭,这就是并发
进程状态
初始态,就绪态,运行态,挂起态与终止态
创建进程
Fork函数
- 函数作用:创建子进程
- 原型: pid_t fork(void);
- 函数参数:无
- 返回值:调用成功:父进程返回子进程的PID,子进程返回0; 调用失败:返回-1,设置errno值。
● fork函数代码片段实例
...... pid_t pid = fork(); if(pid<0) { perror("fork error"); return -1; } else if(pid>0) { printf("father: [%d], pid==[%d], fpid==[%d]\n", pid, getpid(),getppid()); //sleep(1); } else if(pid==0) { printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid()); } ......
exec函数族
如果想在一个进程内部执行系统命令或者是应用程序, 可以使用execl和execlp函数拉起可执行程序或者命令.
- execl() 通常用来执行用户自定义程序
- execlp() 通常用力啊执行系统命令,如要执行自定义程序,需将程序加入系统环境变量
....... else if(pid==0) //子进程 { printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid()); execl("/bin/ls", "ls", "-l", NULL); execl("./test", "test", "hello", "world", "ni", "hao", NULL); execlp("ls", "ls", "-l", NULL); ......
回收进程
当一个进程退出之后,进程能够回收自己的用户区的资源,但是不能回收内核空间的PCB资源,必须由它的父进程调用wait或者waitpid函数完成对子进程的回收,避免造成系统资源的浪费。
孤儿进程
孤儿进程是指父进程已死而子进程还活着,此时子进程就是孤儿进程。
孤儿进程会被init进程领养。
僵尸进程
若子进程死了,父进程还活着, 并且父进程没有调用wait或waitpid函数回收子进程,此时子进程就成了僵尸进程。
由于僵尸进程已死,不能用kill命令杀死子进程,回收子进程的方法如下:
杀死父进程->僵尸进程被init进程领养->由init回收
回收函数
函数原型
#include <sys/wait.h> pid_t wait(int * statloc); pid_t waitpid(pid_t pid,int *statloc,int options);
调用wait或waitpid的进程发生的情况如下:
- 如果所有子进程都还在运行,则阻塞
- 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回
- 如果它没有任何子进程,则立即出错返回
这篇关于Linux系统编程-进程控制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04Linux系统上离线升级SSH服务的具体操作步骤-icode9专业技术文章分享
- 2024-06-0600-macOS和Linux安装和管理多个Python版本
- 2024-03-30[译]漫画SELinux概念
- 2024-03-29linux 移动文件
- 2024-03-28linux .so file
- 2024-03-28Linux 磁盘管理
- 2024-03-28Linux学习笔记(十三)磁盘管理(一):磁盘分区
- 2024-03-26linux 创建 文件
- 2024-03-25使用SecureCRT对Linux vim进行颜色设置
- 2024-03-202019-2020-12 20199317 《Linux内核原理与分析》 第十二周作业