1.什么是程序?
程序:一堆待执行的代码。 gcc hello.c -o hello 静态的文本数据
什么是进程?
进程:当程序被CPU加载时,根据每一行代码做出相应的效果,形成动态的过程,那么这个过程就是 进程。 其实说白了,进程就是一个正在执行的程序。
查看进程ID号命令: ps -ef(静态)
查看进程CPU的占用率:top(动态)
查看自己的PID号:getpid()
查看父进程的PID号:getppid()
2.进程从诞生到死亡会经历哪些状态?
就绪态 TASK_RUNNING 等待CPU资源 不占用CPU资源,不运行代码。
运行态 TASK_RUNNING 占用CPU资源,运行代码。(执行态)
暂停态 TASK_STOPPED 占用CPU资源,不运行代码。 可以到就绪态。
睡眠态TASK_UNINTERRUPIBLE
占用CPU资源,运行代码。 可以到就绪态。
TASK_INTERRUPTIBLE 响应信号 ----》浅度睡眠 pause()--->一直等待下一信号
TASK_UNINTERRUPTIBLE 不响应信号 ----》深度睡眠
僵尸态 EXIT_ZOMBIE 占用CPU资源,不运行代码。不可以到运行态。进程退出的时候,就一定会变 成僵尸态
死亡态 EXIT_DEAD 不占用CPU资源,不运行代码。进程退出的时候,如果有人去帮自己回收资源, 那么僵尸态就会变为死亡态。
3.如何在一个正在运行的进程中产生一个子进程?
可以用pid_t fork(void),返回值:成功(一次调用有两次返回)分别是:
>0:父进程,但返回的ID号是子进程的ID号
=0:子进程
失败:返回-1
4.什么是孤儿进程和僵尸进程?
孤儿进程:调用fork()函数创建的子进程,父进程若比子进程先退出,子进程称为孤儿进程。
僵尸进程:调用fork()函数创建的子进程,子进程若比父进程先退出,子进程退出后称为僵尸进程(进程的状态栏为defunct)。
注意:若父进程走了,子进程还在一直循环,可用命令kill -9(后边这里写的是子进程的ID号)来结束。
5解决僵尸态问题
这个时候就要用到函数pid_t wait(int*status); status:监听子进程的退出状态
当里边填NULL时,如:wait(NULL):表示父进程只回收资源,不关心子进程退出状态
当里边不为NULL时,如:int i,wait(&i),表示父进程不仅回收资源还关心子进程的退出状态,退出状态保存到i变量中。
返回值:成功:返回回收资源的子进程ID号,失败返回-1。
注意:wait属于一个阻塞函数,若子进程没退出变成僵尸态,这函数就会一直阻塞,直到子进程变成僵尸态后。
本次小编就不画图了,刚兴趣的朋友可以结合以下代码,动动手测试体验以下哦~
分享到这里就结束啦,刚兴趣的朋友可以点个关注,小编会不定期更新分享编程知识哦~