Linux系统学习—进程学习篇

导读:本篇文章讲解 Linux系统学习—进程学习篇,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一.进程和程序解析

(1)概念:

  1. 程序是静态的概念,如gcc xxx.c –o pro,在磁盘中生成pro文件,这叫做程序
  2. 进程是指程序的一次运行活动(通俗点就是程序跑起来了,系统中就多了一个进程)

(2)查看系统中的进程:

  • 可使用ps指令查看,同时可使用grep来查找程序中你想找的某个进程

(3)进程管理器

  • 可以通过使用ps -aux / top来调用显示系统全部进程(类似于windows下的任务管理器),同时也可在后面加grep查找你想找的某个进程

(4)进程标识符

  • 每一个进程都有一个非负整数表示的唯一ID,称作pid(类似身份证)
  1. Pid=0 :称为交换进程(作用—进程调度)

  2. Pid=1 :为init进程 (作用—系统初始化)

(5).父进程与子进程概念

  • 进程A创建了进程B,那么A叫做父进程,B叫做子进程

(6) C程序的存储空间分配在这里插入图片描述

二.getpid()解析

头文件:

  • #include <sys/types.h>
    #include <unistd.h>

函数原型:

  • pid_t getpid(void);

代码演示:

在这里插入图片描述

三.创建进程fork和vfork解析

(1) fork解析

  • 头文件: #include <unistd.h>

函数原型:

  • pid_t fork(void);

实质:

  • 会对父进程存储空间进行拷贝一份,在拷贝那份上运行,父进程和子进程会同时运行,两者运行快慢取决于系统进程调度。

代码演示:

在这里插入图片描述在这里插入图片描述

  • 第一行是由父进程执行
  • 第二行由子进程同时执行得出子进程ID号码

(2) 父进程、子进程区分解析

fork函数调用成功后,返回两次
  • 返回值为0时,此时代表当前进程为子进程

  • 返回值大于0时,代表当前进程为父进程

  • 调用失败的情况下,返回值为-1

代码演示:

在这里插入图片描述
在这里插入图片描述
(3) vfork解析

头文件:

#include <sys/types.h>
#include <unistd.h>

2.函数原型:

	pid_t vfork(void);

3.与fork函数对比区别:

  1. vfork 直接使用父进程的存储空间,不用在另起拷贝一份

  2. vfork 执行首先保证子进程先运行,直到子进程调用**exit()**函数退出后,才执行父进程

使用fork和vfork函数代码对比:

(1)使用fork函数:
在这里插入图片描述
编译结果:
在这里插入图片描述父子进程同时进行

(2)使用vfork:

在这里插入图片描述
编译结果:
在这里插入图片描述没有执行exit函数,则子进程一直执行

(4) 进程的退出

使用exit(结束码)、_exit(结束码)、_Exit(结束码)退出,都会带上一个结束码

(5)僵尸进程:

在这里插入图片描述
在这里插入图片描述
调用ps -aux 查看:

在这里插入图片描述

此时父进程没有使用wait()来接收子进程返回的结束码导致子进程变成僵死进程(僵尸进程)Z+

(6)使用wait()接收子进程结束码

概念:

  • 父进程等待子进程退出,收集子进程的退出状态,如果子进程退出状态不被收集,子进程则会变成僵尸进程

  • 可采用宏:==WEXITSTATUS == 来收集exit(结束码)退出的结束码,这样子进程才不会变成僵尸进程

四.wait和waitpid解析

头文件:

#include <sys/types.h>
#include <sys/wait.h>

函数原型:

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

1.Option: 常用宏WNOHANG不会阻塞父进程
2.使用wait()函数会在exit()结束之前阻塞父进程,知道子进程结束才会执行wait()以后的代码
3.wait()下子进程不会成为僵尸进程,而waitpid()下不会阻塞父进程但是子进程会变成僵尸进程

代码演示:
在这里插入图片描述

五.孤儿进程

在这里插入图片描述

总结:

  1. 要理解fork、vfork创建进程的区别,以及进程的概念、含义、作用
  2. 进程是之上级传指令下来给父进程,父进程将指令传给小弟子进程去完成任务,而父进程继续留下来接受新的指令,这样重复叫新的子进程去完成。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68487.html

(0)
newbe的头像newbebm

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!