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

笔记整理—linux进程部分(1)进程终止函数注册、进程环境、进程虚拟地址

        对于mian()函数而言,执行前也需要先执行一段引导代码才会去执行main()函数,该部分的代码包含构建c语言的运行环境等配置,如清理bss段等。

        在使用gcc去编译程序的时候,使用gcc -v xxx.c可见链接过程。在编译完成后可见xxx.out文件。

        当运行一个程序时,加载器将程序需要的程序加载内存中运行(编译时用到的是连接器,运行时用到的是加载器)。argc与argv的参数输入就在这个部分实现;加载器->引导代码->mian()。

        程序结束,正常结束使用return、exit、_exit等。

        非正常结束程序是通过自己或它程序发送信号实现程序终止如ctrl+c(linux而言)。

        atexit()向系统注册进程终止处理函数。

int atexit(void (*func)(void))
void func1(void)
{printf("func1\n");
}int mian(void)
{printf(......);//①atexit(func1);//②printf(......);//③return 0;
}

        执行顺序为①->③->②打印func1。当多个atexit函数注册时,先注册的后执行幕后注册的先执行。其原因是atexit是用一个栈去存储这些注册的函数指针的。

        return和exit的效果其实是一样的,但_exit(0)不会去执行atexit注册的函数。return和exit就类似于回调函数,但_exit(0)是内核直接终止了进程,不会对现场进行清理和打扫。(回调函数,作为参数传递给另一个函数,在被调用函数执行完成后再执行)。

       

        进程环境

        环境变量,环境就是周围的东西,可用拿来使用。使用echo $PATH打印当前PATH,使用export打印所有的环境变量.所以进程所在环境变量存在进程环境表中。

        当前进程中可以直接使用环境变量表中的变量environ。

extern char **environ//本质是一个字符串数组
int i=0;
while(NULL!=environ[i])
{printf(。。。。。。,environ[i]);i++;
}

        char *getenv(const char *name);查找环境变量。

        int setenv(const char *name, const char *value, int overwrite);设置环境变量。

        clearenv()清理环境变量。

        等等

        进程运行的虚拟地址空间,让每个进程运行在独立的虚拟空间,认为整个内存只有自己一个在运行,但实际上是独立分时使用。

        虚拟空间,说给你,但实际不给你,毕竟程序不是自己就开始原地运行的,只有在用到的时候才会给你用到的内存大小。

        意义,实现内存隔离提高安全性,多进程同时运行时,当链接地址==运行地址时,程序运行虚拟地址映射,所在的地址从0开始,程序不用关系真实的物理地址是多少。这就是gcc编译时不用提供链接地址的原因。

 

        进程,进程是一个动态的过程不是静态的实际物质,静态->在硬盘里;动态->在RAM内存里。内进程控制块PCB,核中有专门用于管理进程控制的数据结构。

        进程ID,是PCB中的一个元素,用于标识唯一表示进程的区分,使用ps -aux打印进程信息,PID 1是内核->用户态进程。

getpid()//得到自己的pid
getppid()//得到父进程pid
getuid()//得到当前进程用户ai
getgid()//得到当前组id

        进程PID结束后,id不会复用,所以开机pid数字2w以上是正常的。getpid()本质是从pcb中读取的。

        多进程调度原理,操作系统要求多进程同时运行,否则不干活;本质上是宏观的并行,围观的串行,单核cpu在同一时间只能干一件事,但这个事情是极短的,所以在宏观上可看作并行,现代操作系统最小调度单位是线程而不是进程。

        调度器,依照进程所需时间,级别,情况等进行调度安排时间分配。

相关文章:

  • 如何在iPad上用Chrome实现无痕浏览
  • 亚信安慧AntDB基于操作符的隐式转换
  • 【k8s】:DevOps 模式详解
  • ASCII Unicode UTF-8 字符集 字符编码
  • 使用腾讯地图,在地图上圈选标记半径范围
  • 预防工作场所的违规政策
  • Vue 技术入门 day1 模版语法、数据绑定、事件处理、计算属性与监视、class和style绑定、条件渲染v-if/v-show、列表渲染v-for
  • 回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出
  • 召回06 双塔模型two-tower(DSSM)
  • 【中间件——基于消息中间件的分布式系统的架构】
  • Facebook公共主页bug问题解决措施清单
  • ArcEngine C#二次开发图层处理:根据属性分割图层(Split)
  • 【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修
  • 【数据库】sqlite
  • Qt 每日面试题 -3
  • exports和module.exports
  • hadoop集群管理系统搭建规划说明
  • k个最大的数及变种小结
  • MySQL-事务管理(基础)
  • PHP 7 修改了什么呢 -- 2
  • Redis 懒删除(lazy free)简史
  • SQLServer之创建数据库快照
  • vue--为什么data属性必须是一个函数
  • Web设计流程优化:网页效果图设计新思路
  • 配置 PM2 实现代码自动发布
  • 前嗅ForeSpider教程:创建模板
  • 入口文件开始,分析Vue源码实现
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 通过几道题目学习二叉搜索树
  • 小程序01:wepy框架整合iview webapp UI
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 《码出高效》学习笔记与书中错误记录
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​用户画像从0到100的构建思路
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • %check_box% in rails :coditions={:has_many , :through}
  • (30)数组元素和与数字和的绝对差
  • (35)远程识别(又称无人机识别)(二)
  • (a /b)*c的值
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (补)B+树一些思想
  • (不用互三)AI绘画工具应该如何选择
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .apk 成为历史!
  • .NET Reactor简单使用教程