以下内容全部摘自UNIX环境高级编程(第3版)
退出函数
3个函数用来正常终止一个程序:_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核。
#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status):
存储空间分配
ISO C说明了3个用于存储空间动态分配的函数。
1. malloc
,分配指定字节数的存储区。此存储区中的初始值不确定。
2. calloc
,为指定数量指定长度的对象分配存储空间。该空间中的每一位(bit)都初始化为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);
3个函数返回值:若成功,返回非空指针;若出错,返回NULL
void free(void *ptr);
环境变量
ISO C定义了一个函数getenv
,可以用其取环境变量值
#include <stdlib.h>
char *getenv(const char *name);
返回值:指向与name关联的value的指针;若未找到,返回NULL
我们应当使用getenv
从环境中取一个指定环境变量的值,而不是直接访问environ
。
#include <stdlib.h>
int putenv(char *str);
函数返回值:若成功,返回0;若出错,返回非0
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);
两个函数返回值:若成功,返回0;若出错,返回-1
这三个函数的操作如下:
* putenv
取形式为name=value
的字符串,将其放到环境表中。如果name
已经存在,则先删除其原来的定义
* setenv
将name
设置为value
。如果在环境中name
已经存在,那么:
1. 若rewrite
非0,则首先删除其现有的定义
2. 若rewrite
为0,则不删除其现有定义(name
不设置为新的value
,而且也不出错)。
* unsetenv
删除name
的定义。即使不存在这种定义也不算出错。
函数setjmp和longjmp
#include <setjmp.h>
int setjmp(jmp_buf env);
返回值:若直接调用:返回0;若从longjmp调用,则为非0
void longjmp(jmp_buf env, int val);
函数getrlimit和setrlimit
每个进程都有一组资源限制,其中一些可以用getrlimit
和setrlimit
函数查询和更改。
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
两个函数返回值:若成功,返回0;若出错,返回非0
对这两个函数的每一次调用都制定一个资源以及一个指向下列结构的指针。
struct rlimit {
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
};
在更改资源限制时,须遵循下列3条规则。
1. 任何一个进程都可将一个软限制值更改为小于或等于其硬限制值。
2. 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低,对普通用户而言是不可逆的。
3. 只有超级用户进程可以提高硬限制值
常量RLIM_INFINITY
指定了一个无限量的限制