main函数启动前和启动后的一些动作

本文详细解析了C++程序的执行流程,包括程序启动前的初始化过程、main函数前后发生的活动,以及如何通过atexit注册函数来确保程序正常终止时能够执行特定清理任务。

一、main结束 不代表整个进程结束
  (1)全局对象的构造函数会在main 函数之前执行,
          全局对象的析构函数会在main函数之后执行;
          用atexit注册的函数也会在main之后执行。
  (2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作
  (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行。全局对象的构造也在main之前。
二、main()之后执行的代码,用atexit注册的函数也会在main之后执行

 

 

C++中,全局对象的构造函数会在main 函数之前执行。

在大多数的实现方式里,核心会运行专门的启动代码,启动代码会在启动main()之前完成所有的初始化工作,这其中当然包括了全局对象的初始化。这个所谓的启动代码就是Runtime函数库的Startup代码。
在程序执行时,系统会先调用Startup,完成函数库初始化、进程信息设立、I/O stream产生,以及对static对象的初始化等动作。然后Startup调用main()函数,把控制权交给main()函数。main()函数执行完毕,控制权交回给Startup,进行反初始化动作。

### Android 系统启动流程函数级详解 #### 启动 BootLoader 加载内核 Android 设备开机后,首先运行的是引导加载程序(BootLoader)。它负责初始化硬件并加載操作系统内核。这一阶段的具体实现依赖于设备厂商的设计。 #### 初始化 Init 进程 内核加载完成后,第一个用户空间进程 `init` 被创建。该进程通过解析 `/system/core/rootdir/init.rc` 文件来定义系统的初始状态后续服务的启动顺序[^4]。 在 `init.rc` 中的关键部分如下: - **触发 Zygote 启动**:当条件满足时(如加密状态),`trigger zygote-start` 将被激活,并进一步调用 `start zygote` 命令。 - **Zygote 配置文件导入**:根据系统属性 `${ro.zygote}` 导入对应的 32 或 64 位配置文件。 #### 创建 Zygote 进程 Zygote 是 Android 应用程序的核心容器,其主要职责是预加载通用库资源以便快速派生新的应用程序实例。以下是 Zygote 的核心启动过程: 1. **注册 Native 方法**:Zygote 使用 JNI 注册一系列 native 函数供 Java 层调用。 2. **设置 Dalvik VM 参数**:调整虚拟机堆大小其他性能参数。 3. **进入主循环**:监听 socket 请求以响应新应用进程的创建需求。 #### System Server 启动 Zygote 完成初始化后会 fork 出一个子进程作为 `SystemServer`。此进程中包含了多个关键管理器服务,例如 ActivityManagerService (AMS),WindowManagerService (WMS) 等。重要步骤包括: - **绑定框架组件**:通过 Service Manager 注册各种服务接口。 - **调用 systemReady()**:这是整个系统准备就绪的重要标志之一,在这里 AMS 执行了一系列必要的初始化操作[^1]。例如: ```java public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { synchronized (this) { startHomeActivityLocked(currentUserId, "`"); } } ``` #### Home Launcher 启动 随着 `systemReady()` 的完成,Launcher 桌面会被显式启动,标志着用户界面正式可用[^3]。这一步骤通常涉及以下动作: - **启动默认桌面活动**:调用 `startHomeActivityLocked()` 来开启指定用户的主屏幕。 #### Application Thread 绑定 对于每一个即将运行的应用程序而言,都需要经历从 App Process 到 Framework Layer 的交互过程。具体表现为: - **主线程入口**:每个 APK 的 entry point 实际位于 `ActivityThread.main()` 方法内部。 - **Binder 通信建立**:借助 IPC 机制告知 AMS 当进程已准备好接受任务分配[^2]。典型代码片段展示如下: ```java @Override public final void attach(boolean systemApp) { mAppThread = new ApplicationThread(); if (!systemApp) { try { ActivityManagerNative.getDefault().attachApplication(mAppThread); } catch (Exception e) { throw new RuntimeException("Unable to attach application", e); } } } ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值