APUE学习笔记-进程环境

本章我们将学习:当程序执行时,其main函数是如何被调用的;命令行参数是如何传递给新程序的;典型的存储空间布局是什么样式;如何分配另外的存储空间;进程如何使用环境变量;进程的各种不同终止方式等。

1.main函数

C程序总是从main函数开始执行。main函数的原型是:
int main(int argc, char *argv[]);

其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组。

2.进程终止

(1)有8种方式使进程终止,其中5种为正常终止,它们是:

  • 从main函数返回;
  • 调用exit;
  • 调用_exit或_Exit;
  • 最后一个线程从其启动例程返回;
  • 从最后一个线程调用pthread_exit。

(2)异常终止有3种方式:

  • 调用abort;
  • 接到一个信号;
  • 最后一个线程对取消请求做出响应。

(3)退出函数

如下3个函数用于正常终止一个程序:_exit和Exit立即进入内核,exit则先执行一些清理处理,然后返回内核。

1)由于历史原因,exit函数总是执行一个标准I/O库的清理关闭操作:对于所有打开流调用fclose函数。这造成输出缓冲区中的所有数据都被冲洗(写到文件上)。

2)main函数返回一个整型值与用该值调用exit是等价的。于是在main函数中,exit(0)等价于return(0)。

3.命令行参数

当执行一个程序时,调用exec的进程可将命令行参数传递给该新程序。这是UNIX shell的一部分常规操作。考虑如下示例:

然后编译输出,有如下结果:

4.环境表(P163)

每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:
extern char **environ;

5.C程序的存储空间布局

历史沿袭至今,C程序一直由下列几部分组成:

  • 正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,且常常是只读的。
  • 初始化数据段。通常将此段称为数据段,它包含了程序中需要明确地赋初值的变量。例如C程序中任何函数之外的声明:
    int maxcount = 99;
  • 未初始化数据段。通常将此段称为bss段,在程序开始执行之前,内核将此段中的数据初始化为0或空指针。函数外的声明:
    long sum[1000];
    使此变量存放在非初始化数据段中。
  • 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。
  • 堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于未初始化数据段和栈之间。

典型的存储空间安排:apue存储器安排

6.存储空间分配

ISO C说明了3个用于存储空间动态分配的函数:

(1)malloc,分配了指定字节数的存储区。此存储区中的初始值不确定。

(2)calloc,为指定数量指定长度的对象分配存储空间。该空间中的每一位(bit)都初始化为0。

(3)realloc,增加或减少以前分配区的长度。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定。

函数free释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池。

7.环境变量(P168)

8.函数setjmp和longjmp(P170)

在C中,goto语句是不能跨越函数的,而执行这种类型跳转功能的是函数setjmp和longjmp。

9.函数getrlimit和setrlimit(P175)

每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注