目录
问题4:fork()调用子进程,子进程中的内容是对父进程的拷贝,会不会出现无限调用子程序的情况出现?
一.基本概念
1.进程
通俗的观念:程序的一个执行实例,或正在执行的程序。
内核的观点:担当分配系统资源(CPU时间和内存)的实体。
2.进程控制块-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
3.Linux中的PCB
Linux操作系统下的PCB是:task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
二.进程信息
使用 ps aux 命令可以查看进程,如下:

进程信息也可以进入/proc 系统文件夹查看:

那么如何查看我们自己写的代码被加载到内存后的进程信息?先来看如下代码:



这两种方法都可以,查到进程的进程号。
要查看自己写的代码进程信息,首先要保证代码的运行时间够长,如果运行时间太短,那么查看时进程就已经退出,查看不到了。以上代码中我使用了死循环,将test.c文件进行编译生成test文件运行后,使用命令 ps aux | grep mytest 就可以查看到进程信息。如果要停止运行,在执行的界面输入:Ctrl+c 就可以结束当前进程。
注意:只有代码在运行的时候,才能看到进程。
三.PID的获取
描述本进程的唯一标示符(PID),用来区别其他进程。创建任何进程时,它都有一个唯一的ID,称为其进程ID。有两个系统调用函数用于获取进程ID,这些函数是:
1.getpid()
它的返回值就是当前进程的PID,当代码运行起来后,PID被打印出来,结果与用命令 ps aux | grep test 查看到的结果一致。
2.getppid()
它的的返回值是当前进程的父进程的PID,与getpid()功能类似。
四.进程的三种状态
站在CPU的角度,进程状态可以分为:运行、就绪、阻塞。
运行:进程占用CPU,正在使用CPU来执行自己的代码
就绪:进程已经具备运行条件,但是CPU没有分配过来。
阻塞:进程等待某种资源,而不能运行。例如:等待IO输入。
用一幅图来直观的理解:

五.细分的七中进程状态
1.R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。来看如下代码:


代码是死循环,并且什么都不做,当程序运行起来后CPU的占用率非常高,此时当前进程就是运行状态。
2.S 可中断睡眠睡眠状态(sleeping): 意味着进程在等待事件完成。
如下代码:

3. D 不可中断睡眠状态休眠状态,在这个状态
本文详细解析Linux进程的基本概念,包括进程、进程控制块PCB以及Linux下的PCB实现。通过实例探讨进程信息获取、进程状态、创建子进程的fork机制,以及僵尸进程和孤儿进程的产生、危害及解决方案。最后解答了关于进程执行顺序、1号进程、进程创建及进程状态标识等常见问题。
最低0.47元/天 解锁文章
24万+

被折叠的 条评论
为什么被折叠?



