UNIX环境高级编程之第7章:进程环境

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngyangyang04/article/details/47903651

7.1 引言

本章学习:当程序执行时,其main函数使如何被调用的命令行参数是如何传给新程序的典型的存储空间布局如何分配另外的存储空间进程如何使用环境变量进程的各种不同的终止方式另外还说明longjmp和setjmp函数以及它们与栈的交互作用还有查看进程的资源限制

7.2 main函数

c程序总是从main函数开始执行。main函数的原型是:
int main(int argc, char *argv[]);
其中, argc是命令行参数的数目argv是指向参数的各个指针所构成的数组

7.3 进程终止

有8种方式是进程终止(termination),其中5种为正常终止
(1)从main返回
(2)调用exit
(3)调用_exit或_Exit
(4)最后一个线程从其启动例程返回
(5)从最后一个线程调用pthread_exit
异常终止
(6)调用abort
(7)接到一个信号
(8)最后一个线程对取消请求做出响应
1. 退出函数
3个函数用于正常终止一个程序:_exit 和 _EXIT立即进入内核,exit则先执行一些清理处理,然后返回内核。
#Include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
2. 函数atexit
一个进程可以等级多至32个函数,这些函数将由exit自动调用。我们称这些函数为 终止处理程序(exit handler),并调用atexit函数来登记这些函数。
#include <stdlib.h>
int atexit(void (*func)(void));

7.4 命令行参数

调用exec的进程可将 命令行参数(Command-Line Arguments)传给该新程序

7.5 环境表

每个程序都接收到一张 环境表。是一个字符指针数组



7.6 C程序的存储空间布局

C程序一直有下列几个部分组成:
(1)正文段(Text segment)。这是CPU执行的机器指令部分。
(2)初始化数据段(Initialized data segment)。它包含程序中需明确赋初值的变量,例如
int maxcount = 29;
(3)未初始化数据段(Uninitialized data segment)。例如long sum[1000];
(4)栈(stack)。自动变量以及每次函数调用时所需保存的信息都保存在此段中。比如每次函数调用时, 其返回地址以及 调用者的环境信息都存在栈中。
(5)堆(Heap)。通常在堆中进行动态存储分配。




7.7 共享库

共享库使得 可执行文件中不在需要包含共有的库函数,而只需在所有进程 都可引用的存储区中保存这种库例程的一个副本.程序第一次执行或者第一次调用某个库函数时,用 动态链接方法将程序与共享库函数相链接.这减少了每个执行文件的长度,但增加了一些时间开销.
共享库的 另一个优点是可以用库函数的新版本替代老版本而无需对使用该程序重新连接编译.

7.8 存储空间分配

ISO C说明了3个用于存储空间动态分配的函数.
(1)malloc ,分配指定字节数的存储区.此 空间的初始值不确定
(2)calloc,为指定数量指定长度的对象分配存储空间. 该空间中的每一位都初始化为0
(3)realloc,增加或减少以前分配区的长度.当增加长度是,可能需将以前分配去的内容移到另一个足够大的区域,新增区域的初始值不确定
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);

void free(void *ptr);

若调用malloc函数,但却忘了调用free函数,那么该进程占用的存储空间就会持续增加

7.9 环境变量

7.10 函数setjmp和longjmp

7.11 函数getrlimit和函数setrlimit

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

7.12 小结

本章说明了一个进程使如何启动和终止的,如何向其传递参数表和环境.虽然参数表和环境都不是内核进行解释的,但内核调用exec将这两者传递给新进程的作用.
还介绍了c程序的经典存储空间布局,以及一个进程如何动态地分配和释放存储空间.

习题:为什么使用共享库文件大小由很大变化? 没有使用共享库是, 可执行文件的大部分都被标准I/O库占用


这段代码不正确,自动变量val已经不存在之后,代码还通过指针ptr引用这个已经不存在的自动变量


猜你喜欢

转载自blog.csdn.net/youngyangyang04/article/details/47903651
今日推荐