Linux系统编程——进程基础知识
1、程序和进程
程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)
进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)
一个程序多次运行可以产生不同进程,如:ssh登陆
2、进程控制块(Processing Control Block)
我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
Ubuntu20.04在/usr/src/linux-hwe-5.8-headers-5.8.0-55/include/linux/sched.h中
3、进程控制
3.1创建子进程fork()函数
注意返回值,不是fork函数能返回两个值,而是fork后,fork函数变为两个,父子需【各自】返回一个。
3.2父子进程的异同
父子进程之间在fork后。有哪些相同,那些相异之处呢?
父子不同处:
3.3几个关于进程ID的函数
3.4exec函数族
exec函数族
具体格式,例子
execlp(“ls”, “ls”, “-l”, “-F”, NULL); 使用程序名在PATH中搜索。
execl("/bin/ls", “ls”, “-l”, “-F”, NULL); 使用参数1给出的绝对路径搜索。
3.5回收子进程
孤儿进程
在操作系统领域中,孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。
1、阻塞等待子进程退出
2、 回收子进程残留资源
3、获取子进程结束状态(退出原因)。
当进程终止时,操作系统的隐式回收机制:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号)
可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。如下图:
waitpid函数
参数options
注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程应使用循环。
参考书籍:《中文版 第三版UNIX 环境高级编程 第3版》
参考教程:linux全套教程