`

程序的启动与进程的终止

阅读更多
    C 程序总是从 main 函数开始执行,main 函数可接收命令行参数。当内核执行 C 程序时(使用一个 exec 函数),在调用 main 前会先调用一个特殊的启动例程,可执行程序文件将其指定为程序的起始地址,这是由连接编辑器设置的,而连接编辑器则由 C 编译器调用。启动例程从内核取得命令行参数和环境变量值,然后为调用 main 函数做好安排。
    让进程终止有 8 种方式,其中 5 种为正常终止,分别为:
    (1)从 main 返回;
    (2)调用 exit;
    (3)调用 _exit 或 _Exit;
    (4)最后一个线程从其启动例程返回;
    (5)从最后一个线程调用 pthread_exit。
    异常终止有 3 种方式,分别是:
    (1)调用 abort;
    (2)接到一个信号;
    (3)最后一个线程对取消请求做出响应。
    启动例程就是这样编写的:从 main 返回后立即调用 exit 函数。如果将其以 C 代码形式表示(实际上常常用汇编语言编写),则它调用 main 函数的形式可能是:
        exit(main(argc, argv));
    下面 3 个函数用于正常终止一个程序。
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);

    其中 _exit 和 _Exit 会立即进入内核,exit 则总是执行一个标准 I/O 库的清理关闭操作后才返回内核。这三个函数所带的整型参数常被称为终止状态。大多数 UNIX 系统 shell 都提供检查进程终止状态的方法。如果(a)调用这些函数时不带终止状态,或(b)main 执行了一个无返回值的 return 语句,或(c)main 没有声明返回类型为整型,则该进程的中指状态就是未定义的。而若 main 的返回类型是整型,并且 main 最后返回(隐式返回),那么该进程的终止状态就是 0。
    按照 ISO C 的规定,一个进程可调用 atexit 函数登记多个终止处理程序函数(可以使用 sysconf 函数来确定),这些函数将由 exit 以与登记时相反的顺序自动调用。同一函数如若登记多次,也会被调用多次。
#include <stdlib.h>
int atexit(void (*func)(void));   /* 返回值:若成功,返回 0;否则,返回非 0 */

    exit 首先调用各终止处理程序,然后使用 fclose 关闭所有打开流。如若程序调用 exec 函数族中的任一函数,则将清除所有已安装的终止程序。
    下图显示了一个 C 程序是如何启动的,以及它终止的各种方式。

    注意,内核使程序执行的唯一方法是调用一个 exec 函数,自愿终止的唯一方法是显示或使用 exit 隐式地调用 _exit 或 _Exit。进程也可非自愿地由一个信号来终止(图中未显示)。
    下面是一个 atexit 函数使用的示例。
#include <stdio.h>
#include <stdlib.h>

static void my_exit1(void);
static void my_exit2(void);

int main(void){
	if(atexit(my_exit2) != 0)
		printf("can't register my_exit2\n");
	if(atexit(my_exit1) != 0)
		printf("can't register my_exit1\n");
	if(atexit(my_exit1) != 0)
		printf("can't register my_exit1\n");
	printf("main is done\n");
	return 0;
}

static void my_exit1(void){
	printf("first exit handler\n");
}

static void my_exit2(void){
	printf("second exit handler\n");
}

    编译后的运行结果:
$ ./atexitDemo.out
main is done
first exit handler
first exit handler
second exit handler

  • 大小: 20.8 KB
分享到:
评论

相关推荐

    MySQL数据库启动失败1067进程意外终止

    MySQL数据库启动失败1067进程意外终止的解决办法总结 MySQL数据库是一个非常流行的关系型数据库管理系统,但是在使用中可能会出现一些问题,例如MySQL数据库启动失败1067进程意外终止错误。这种错误可能是由于多种...

    为应用程序池XX提供服务的进程意外终止。进程ID是XX.解决办法

    ### 为应用程序池XX提供服务的进程意外终止。进程ID是XX.解决办法 #### 问题概述 在IIS(Internet Information Services)服务器环境中,有时会遇到“为应用程序池XX提供服务的进程意外终止。进程ID是XX”的错误...

    怎样终止无法正常终止的进程

    - 启动新的`notepad.exe`进程并进行调试: ``` ntsd notepad.exe ``` **调试命令:** 连接到进程后,可以使用以下命令进行调试: - `~` 显示所有线程的列表。 - `KB` 显示当前线程的堆栈轨迹。 - `~*KB` 显示...

    程序启动后结束载入进程

    总的来说,程序启动后结束载入进程的操作涉及到操作系统的基本原理,包括进程管理和进程间通信。在实际开发中,理解并掌握这些知识对于编写高效、稳定的应用程序至关重要。需要注意的是,不当的进程控制可能会导致...

    检查windows启动的进程 监控进程启动 检测进程运行 - CheckProc.7z

    "检查Windows启动的进程、监控进程启动、检测进程运行"这个主题涉及到的是如何查看正在运行的程序,以及如何跟踪这些程序在系统启动时的行为。这有助于识别潜在的恶意软件或者不必要的后台进程,从而优化系统性能和...

    进程控制 如何通过程序控制系统进程

    `Process`类提供了与进程相关的各种操作,如获取当前运行的进程列表,启动新进程,以及控制现有进程等。例如,我们可以使用`Process.GetProcesses()`方法获取系统中所有正在运行的进程列表,然后通过进程的名称或PID...

    进程启动关闭管理程序

    这个程序通常具有权限去终止那些一般用户或普通程序无法结束的进程,以确保系统的顺利关闭。 在这个特定的案例中,"Good.exe"很可能是这个管理程序的主执行文件。它可能包含了检测和管理启动项、监控系统状态、以及...

    Windows 进程终止的消息标识符

    ### Windows 进程终止的消息标识符详解 #### 标题与描述解读 “Windows 进程终止的消息标识符”这一标题直接指出了本文档的主要内容:Windows操作系统中进程终止时所涉及的一些特定消息标识符。这些标识符对于理解...

    强制终止进程

    3. **多进程终止** 在本程序中,用户可以配置需要终止的进程名字,最多可设置256个。这涉及到批量处理进程的能力,程序可能通过遍历当前活动进程列表,匹配预设的进程名,然后调用相应的API(如Windows的`...

    程序冰刃 网络维护终止守护进程

    "程序冰刃 网络维护终止守护进程"这一标题提到了一个名为“冰刃”的程序,它主要用于计算机网络维护,特别强调了其在终止守护进程以及处理木马病毒程序方面的功能。守护进程(Daemon)在操作系统中是常驻内存的后台...

    程序启动监视工具(记录任意程序启动退出)V1.3.zip

    程序启动监视工具是一款实用的软件,它主要用于跟踪和记录计算机上任意程序的启动与退出情况。这个工具在版本V1.3中可能包含了更多优化和改进,以提供更精确、稳定的服务。通过使用这样的工具,用户可以深入了解系统...

    易语言取相同程序不同的进程

    当一个程序被多次启动,就会产生多个进程,每个进程都有自己的内存空间和执行状态。"易语言取相同程序不同的进程"这个主题聚焦于如何在易语言这种编程环境下,获取并管理同一程序的不同进程。 易语言,全称“简易...

    在自己程序中控制其他程序启动

    标题“在自己程序中控制其他程序启动”所涉及的知识点主要涵盖以下几个方面: 1. **进程与程序的概念**:首先,要理解程序与进程的区别。程序是静态的,是存储在磁盘上的可执行文件,而进程则是程序在内存中的动态...

    结束进程小程序

    结束进程可以把"QQ.exe"可以换成其他的,恶搞神器,添加一些代码还可以开机自启动

    进程调度程序设计.doc

    进程调度程序设计是计算机科学与技术系某学院2009级数据库二班的一个课程设计任务,旨在让学生设计一个虚拟内核,该内核能支持多任务管理,提供创建进程、终止进程、进程状态转换、进程调度、上下文切换等功能。...

    VC++使用事件启动和终止进程

    本主题将深入探讨如何在VC++中利用事件来启动和终止进程。 首先,了解Windows API中的事件对象。在Windows系统中,事件有两种状态:信号状态和无信号状态。当事件为信号状态时,表示有一个或多个等待该事件的线程...

    启动与关闭进程

    这个类提供了丰富的属性和方法,如`Start()`用于启动一个进程,`CloseMainWindow()`或`Kill()`用于关闭进程,以及`Process.StartInfo`属性用于设置启动进程的参数。在`ProcessTest`这个项目中,我们可以看到如何使用...

    windows 系统下启动与结束java的jar包的脚本(包括如何设置进程名称)

    ### Windows系统下启动与结束Java的JAR包的脚本(包括如何设置进程名称) 在Windows环境下管理和控制Java应用程序的启动与停止是一项常见的任务。本文将详细介绍如何编写一个批处理脚本来实现这些功能,并且还会...

    操作系统 进程控制 程序

    8. **进程终止**:进程在完成任务或者出现错误时,需要被正确地终止。操作系统会回收进程占用的资源,并更新系统状态。 综上所述,进程控制是操作系统中不可或缺的一部分,而时间片轮转调度算法则是实现公平分配CPU...

    windows进程监听程序

    如果监测到目标进程意外终止或崩溃,该监听程序会自动重启该进程,从而保持系统的稳定性和持续性。 这个程序的核心功能基于Windows API(应用程序接口)提供的各种函数,如`CreateProcess`、`OpenProcess`、`...

Global site tag (gtag.js) - Google Analytics