标签:style blog http color 使用 os io strong
int main( int argc, char *argv[] );
指针数组
正常终止
:
- 从main返回
- 调用exit
- 调用_exit或_Exit
- 最后一个线程从其启动例程返回
- 从最后一个线程调用pthread_exit
异常终止
有3种方式:
- 调用abort
- 接到一个信号
- 最后一个线程对取消请求做出响应
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
终止状态
或退出状态
。大多数Unix系统shell都提供检测进程终止状态的方法。
- 调用这些函数时不带终止状态
- main执行了一个无返回值的return语句
- main没有声明返回类型为整型
#include <stdlib.h>
int atexit(void (*func)(void)); // 参数是一个函数指针
Returns: 0 if OK, nonzero on error
终止处理程序
。注意:内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式(通过调用exit)地调用_exit或_Exit。进程也可非自愿地由一个信号使其终止。
一个C程序的启动,以及它的各种终止方式
extern char **environ;
称environ为环境指针
;指针数组为环境表
,其中各指针指向的字符串为环境字符串
。历史沿袭至今,C程序一直由以下几部分组成:
- 正文段。这是由CPU执行的机器指令部分。通常,正文段是可由多个应用程序共享的,在存储器中只需一个副本。正文段常常是只读的。
- 初始化数据段,也称为数据段。包含了程序中需明确地赋初值的变量。
- 未初始化数据段,也称为bss段(block started by symbol,由符号开始的块)。在程序开始执行之前,内核将此段中的数据初始化为0或空指针。
- 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。
- 堆。通常在堆中进行动态存储分配。惯例,堆位于未初始化数据段和栈之间。
一种典型安排方式,这是程序的逻辑布局
size命令报告正文段、数据段和bss段的长度(以字节为单位)
$ size /usr/bin/cc /bin/sh
text data bss dec hex filename
346919 3576 6680 357175 57337 /usr/bin/cc
102134 1776 11272 115182 1c1ee /bin/sh
第4、5列分别是以十进制和十六进制表示的3段总长度
malloc,初始值不确定
calloc,每一位都初始化为0
realloc,新增区域内的初始值不确定
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
All three return: non-null pointer if OK, NULL on error
void free(void *ptr);
优点:当函数返回时,自动释放它所使用的栈帧,不再需要自己释放空间
缺点:alloca函数增加了栈帧的长度,而某些系统在函数已经被调用后不能增加栈帧长度,于是也就不能支持alloca函数。本书4个平台均支持该函数。
#include <stdlib.h>
char *getenv(const char *name);
Returns: pointer to value associated with name, NULL if not found
#include <stdlib.h>
int putenv(char *str); // name已存在,替换
Returns: 0 if OK, nonzero on error
int setenv(const char *name, const char *value, int rewrite); // 当name已存在时,根据rewrite参数而覆盖或保持原值
int unsetenv(const char *name); // 即使name不存在也不算出错
Both return: 0 if OK, −1 on error
- 删除一个字符串很简单
- 但是增加一个字符串或修改一个现有的字符串就困难得多。因为环境表和环境字符串通常占用的是进程地址空间的顶部,故不能向上扩展;而其下方是各栈帧,故也不能向下扩展。两者组合使得该空间的长度不能再增加。
#include <setjmp.h>
int setjmp(jmp_buf env);
Returns: 0 if called directly, nonzero if returning from a call to longjmp
void longjmp(jmp_buf env, int val);
1. 看情况。大多数实现并不回滚这些自动变量和寄存器变量的值,而所有标准则称它们的值是不确定的。
2. 如果有一个自动变量,而不想其值回滚,可定义为具有volatile属性。
3. 声明为全局变量或静态变量的值在执行longjmp时保持不变。
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
Both return: 0 if OK, −1 on error
struct rlimit {
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
在更改资源限制时,须遵循下列3条规则:
- 任何一个进程都可将一个软限制更改为小于或等于其硬限制值
- 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低,对普通用户而言是不可逆的
- 只有超级用户进程可以提高硬限制值。常量RLIM_INFINITY为无限制
resource参数的取值列举:
RLIMIT_AS 进程总的的可用存储空间的最大长度(字节)
RLIMIT_CORE core文件的最大字节数
RLIMIT_FSIZE 可以创建的文件的最大字节长度
RLIMIT_NOFILE 每个进程能打开的最多文件数
RLIMIT_NPROC 每个实际用户ID可拥有的最大子进程数
RLIMIT_STACK 栈的最大字节长度
《Unix环境高级编程》读书笔记 第7章-进程环境,布布扣,bubuko.com
标签:style blog http color 使用 os io strong
原文地址:http://www.cnblogs.com/DayByDay/p/3911195.html