当前位置: 首页 > news >正文

Linux Process Manage

Linux 下的工作都是依靠进程来执行的,控制了进程就相当于控制了 Linux 系统了。这篇博客将通过 Linux 系统的启动登录来探讨进程管理机制,看这种机制如何支撑和左右进程的命运。

什么是进程

先来了解了解什么是进程,程序这个词比较好理解,通常的程序是静态实体,进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。进程描述符(PID)是唯一用来标识进程的。

进程的创建

fork 和 exec 分别是进程的分身和变身

在运行级别3下启动 Linux,出现命令行界面需要在“login: ”提示符处输入用户名登录,可以另外找一台机子ssh远程连接,查看一下mingetty进程的执行情况:

# ps -ef|grep mingett[y]
root     14450     1  0 14:10 tty1     00:00:00 /sbin/minagetty --noclear tty1 linux
root     14566     1  0 14:13 tty2     00:00:00 /sbin/minagetty --noclear tty2 linux
root     14589     1  0 14:16 tty3     00:00:00 /sbin/minagetty --noclear tty3 linux
root     14591     1  0 14:16 tty4     00:00:00 /sbin/minagetty --noclear tty4 linux
root     14593     1  0 14:16 tty5     00:00:00 /sbin/minagetty --noclear tty5 linux
root     14595     1  0 14:16 tty6     00:00:00 /sbin/minagetty --noclear tty6 linux

这里有6个mingetty进程,对应CTRL+ALT+F1~F6六个虚拟控制台。

在tty1输入用户名并按回车,这里先不要输入密码,回到ssh远程登录终端上,再看看mingetty进程,会发现少了PID为14450的mingetty进程,可以利用ps命令检索PID。

# ps -ef|grep 1445[0]
root     14450     1  0 15:36 tty1     00:00:00 /bin/login --

PID为14450的进程变成了login进程了。这是因为mingetty进程在exec()系统调用的作用下,转变成了login进程。

exec的作用是舍弃进程原先携带的信息,在进程执行时用新的程序代码替代调用进程的内容。

可以分析一下mingetty进程中运行exec的部分源码:

exec(loginprog, loginprog, autologin? "-f" : "--", logname, NULL);

mingetty进程的工作是接收登录用户名,之后的密码验证处理工作则是 login 进程的工作,当验证结束后,便启动用户的bash进程。

同样的再次检索同一个PID会发现 login 进程保留了原先的相同的进程,而且还多了一个 bash 进程。这是因为 bash 进程的父进程ID是14450,这说明bash进程是作为 login 进程的子进程开始启动的。

exec 和 fork 中进程的变化

┌─────┐
│进程  
│PID=X  
│程序=A  
└─────┘
   │
   ↓
┌─────┐
│进程     
│PID=X    
│程序=B   
└─────┘
┌─────┐
│父进程  
│PID=X    ──┓ 
│程序=A      │
└─────┘     │ fork
   │        │
   ↓         ↓
┌─────┐   ┌─────┐
│父进程    │子进程  
│PID=X    │ PID=Y  
│程序=A    │程序=A   
└─────┘   └─────┘

通常fork一个进程是指通过父进程创建一个子进程,生成的子进程与父进程只有PID不一样,login 进程通过fork生成一个自身的副本后,还会在子进程通过exec启动 bash 。这样的机制叫做“fork-exec”

    childPid = fork();//创建子进程
    if (childPid < 0) {
        int errsv = errno;
        fprintf(stderr, _("login: failure forking: %s"), strerror(errsv));
        PAM_END;
        exit(0);
    }
    
    if (childPid) {//父进程,等待子进程退出
    /* parent - wait for child to finish, then cleanup session */
        signal(SIGHUP, SIG_IGN);
        signal(SIGINT, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGTSTP, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
        signal(SIGTTOU, SIG_IGN);//忽略以上信号
        
        wait(NULL);//等待子进程结束
        PAM_END;//PAM结束
        exit(0);
    }
    //以下是子进程
    /* child */
    
    //(省略部分源码)
    childArgv[childArgc++] = NULL;
    //登录成功,执行/bin/sh进入shell
    execvp(childArgv[0], childArgv + 1);

上面是login.c的源码,可以知道父进程会一直等待子进程结束(wait),父进程才会结束。

进程的结束

在已登录的控制台上输入 exit 进行用户注销,此时exit()系统调用,bash进程会被终止,同时发送CHLD信号给父进程login。接收到CHLD信号的父进程login会退出wait函数,同时结束进程。wait是一个函数,它让父进程在接收子进程CHLD信号之前一直保持休眠状态。

另一方面,子进程在向父进程发送CHLD信号,直到父进程接收为止,子进程一直保持僵尸状态。

博客地址 https://github.com/Junnplus/blog/issues/6

相关文章:

  • Linux下的三个时间属性
  • DRBD源码安装配置
  • Power Gating的设计(模块二)
  • php热身2:CRUD with Ajax
  • HIVE中的自定义函数
  • js创建数组的三个方式
  • 零基础小白也能做测试经理(高级测试工程师)?!
  • 【Django】Django Debug Toolbar调试工具配置
  • Jenkins2.3重点备忘
  • 4——PHP比较复制运算符
  • 利用amoeba实现mysql读写分离
  • XML序列化点滴
  • sqlalchemy(二)高级用法
  • eclipse properties 插件
  • CLR存储过程
  • Android交互
  • AngularJS指令开发(1)——参数详解
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS盒模型深入
  • JS实现简单的MVC模式开发小游戏
  • KMP算法及优化
  • Logstash 参考指南(目录)
  • Node 版本管理
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue--为什么data属性必须是一个函数
  • webgl (原生)基础入门指南【一】
  • windows-nginx-https-本地配置
  • windows下mongoDB的环境配置
  • Yeoman_Bower_Grunt
  • 动态魔术使用DBMS_SQL
  • 翻译--Thinking in React
  • - 概述 - 《设计模式(极简c++版)》
  • 简单数学运算程序(不定期更新)
  • 每天一个设计模式之命令模式
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 人脸识别最新开发经验demo
  • 阿里云ACE认证学习知识点梳理
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma pack(1)
  • (52)只出现一次的数字III
  • (C#)一个最简单的链表类
  • (java)关于Thread的挂起和恢复
  • (Oracle)SQL优化技巧(一):分页查询
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十六)Flask之蓝图
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)手动添加用户和文件的特殊权限
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)甲方乙方——赵民谈找工作
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .htaccess配置重写url引擎
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案