### Unix环境高级编程:进程的环境 #### 7.1 引言 在深入探讨进程控制原语之前,本章将详细介绍进程所处的环境。理解进程环境对于掌握进程的行为至关重要,尤其是对于进程如何初始化、如何与外部环境交互以及如何终止等方面。本章节将涵盖以下几个关键知识点: 1. **main函数的初始化及其参数传递机制**。 2. **存储器布局与内存管理**。 3. **环境变量的使用**。 4. **进程终止的不同方式及其区别**。 5. **longjmp与setjmp函数及它们与栈的关系**。 6. **进程资源限制的理解**。 #### 7.2 main函数 每个C程序的执行都是从`main`函数开始的。`main`函数的典型原型如下所示: ```c int main(int argc, char *argv[]); ``` - **argc**: 表示命令行参数的数量(包括程序本身的名字)。 - **argv**: 是一个指向字符串的指针数组,每个元素对应一个命令行参数。 当内核启动一个C程序时(通常通过调用exec函数族的一个成员实现),它会先调用一个特殊的起动例程,该例程负责从内核获取命令行参数和环境变量,并做好调用`main`函数的准备。 #### 7.3 进程终止 进程可以通过以下五种方式终止: 1. **正常终止**: - 从`main`函数返回。 - 调用`exit`函数。 - 调用`_exit`函数。 2. **异常终止**: - 调用`abort`函数。 - 由一个信号触发终止。 其中,`exit`和`_exit`函数用于正常地终止程序。`exit`函数在终止前会执行一系列清理工作,如调用注册的终止处理函数、关闭所有标准I/O流等。而`_exit`函数则直接终止程序,不执行任何清理操作。 ```c #include <stdlib.h> void exit(int status); #include <unistd.h> void _exit(int status); ``` `exit`函数是由ANSI C规定的,而`_exit`则是由POSIX.1标准定义的。通常情况下,建议使用`exit`函数,因为它能够确保资源被正确释放。 #### 7.3.1 `exit`与`_exit`函数 这两个函数都需要一个整型参数,称为**终止状态**(exit status)。这个参数可以用来指示进程正常退出还是遇到错误退出。大多数Unix shell提供了检查进程终止状态的方法。 如果`main`函数没有明确返回一个终止状态,或者使用了无返回值的`return`语句,那么进程的终止状态是未定义的。这意味着下面的经典C语言程序: ```c #include <stdio.h> int main() { printf("Hello, world\n"); } ``` 虽然能够运行,但没有明确返回一个终止状态,因此可能无法准确地确定其执行状态。 为了使程序更加健壮,应该在`main`函数中使用`return (0)`或者`exit(0)`来明确地返回一个终止状态,例如: ```c #include <stdio.h> int main() { printf("Hello, world\n"); return 0; } ``` 或者 ```c #include <stdio.h> #include <stdlib.h> int main() { printf("Hello, world\n"); exit(0); } ``` 以上就是关于Unix环境下进程的环境介绍,通过这些基础知识的学习,可以帮助开发者更好地理解和控制进程的行为。接下来的部分将更深入地探讨与进程相关的其他主题,例如命令行参数、环境变量的使用以及进程资源限制等内容。
- 粉丝: 33
- 资源: 35
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助