void exit(int status);
void _Exit(int status);
void _exit(int status);
_exit和_Exit立刻进入内核,exit则先执行一些清理处理,然后进入内核。
echo $? 打印终止状态
int atexit(void (*func)(void));//终止处理程序,由exit调用,顺序与登记时相反
内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(通过调用exit)调用_exit或_Exit
ISOC和POSIX.1都要求argv[argc]是一个空指针,则参数循环处理可写为:
for( i=0; argv[i] != NULL; i++ )
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
void free(void *ptr);
sbrk扩充(或缩小)进程的堆。
大多数malloc和free的实现都不减小进程的存储空间。释放的空间可供以后再分配,但通常将他们保持在malloc池中而不返回给内核。
alloca函数:在当前函数的栈帧上分配存储空间,而不是在堆中
优点:自动释放
缺点:增加栈帧长度,某些函数可能不支持
环境变量:
字符串格式:
name=value
export name=value
我们能影响的只是当前进程及调用进程的任何子进程的环境,但不能影响父进程的环境。
char *getenv(const char *name);//返回指向name=value字符串中的value
int putenv(char *str);//采取形式为name=value的字符串,将其放到环境表中,已存在则先删除
int setenv(const char *name, const char *value, int rewrite);//已存在,rewrite非0删除,0不删除
int unsetenv(const char *name);//删除name定义
putenv传递的是字符串地址,将存放在栈中的字符串作为参数传给该函数就会发生错误。
pag161
在栈上跳过若干栈帧
int setjmp(jmp_buf env);//env变量定义为全局变量
void longjmp(jmp_buf env, int val);//val 从setjmp返回的值
一个自动变量不想使其值回滚,则定义其为具有volatile属性,声明为全局变量或静态变量的值在执行longjmp时保持不变。
int getrlimit(int resource, struct rlimit *rlptr);//查询进程限制
int setrlimit(int resource, const struct rlimit *rlptr);//更改进程限制
进程的资源限制通常是在系统初始化时由进程0建立的,然后由每个后续进程继承。
资源限制影响到调用进程并由其子进程继承。