Unix环境高级编程学习笔记(五)
第七章 进程环境
1、main函数:int main(int argc, char *argv[])
2、进程中止:
正常中止:(1)从main返回;(2)调用exit;(3)调用_exit或_Exit;(4)最后一个线程从启动例程返回;(5)最后一个线程调用pthread_exit;
异常中止:(6)调用abort;(7)接到一个信号并中止;(8)最后一个线程对取消请求做出反应。
2.1、exit函数:#include<stdlib.h>
void exit(int status);
void _Exit(int status);
#include<unistd.h>
void _exit(int status); _exit,_Exit直接进入内核,exit则先进行一些清理处理(如关闭I/O流等等),然后进入内核。
2.2、atexit函数:
#include<stdlib.h> int atexit(void (*func)(void)); 一个进程结束时候调用的函数,能够登记32个
exit函数会先调用中止处理函数,然后关闭打开流,再进入内核。:if expand("%") == ""|browse confirm w|else|confirm w|endif
3、命令行参数:调用exec的进程能够将命令行参数传递给新进程。
4、环境表:每个程序都会接受到一张环境表。 extern char **environ
按照惯例环境由name=value这样的字符串组成。 通常用getenv和putenv函数来访问特定的环境变量,但是如果要查看整个环境,则必须使用environ
5、c程序的存储空间布局:正文段,初始化数据段,非初始化数据段,栈,堆。
6、共享库:略。
7、存储器分配:malloc,calloc,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);
8、环境变量:
取环境变量:#include<stdlib.h> char *getenv(const char *name); 返回与name关联的value指针,未找到返回null
设置环境变量(只会影响当前进程和子进程)
#include<stdlib.h> int putenv(char *str); 取形式为name = value的字符串,将其放到环境表中
int setenv(const char *name, const char *value, int rewrite); 设置name为value,name已存在,若rewrite非0,则先删除;若rewrite为0,则不删除
int unsetenv(const char *name); 删除name定义
9、setjmp和longjmp函数:实现跨越函数的跳转。
#include<setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
示例:程序清单7-5
9.1、自动、寄存器和易失变量:讨论关于longjmp后变量是否会回滚为原来值。声明为全局或静态变量的值在执行longjmp保持不变。
程序清单7-6:全局、静态和易失变量不受优化影响,他们的值是最近所呈现的值。
9.2、自动变量的潜在问题:略。
10、getrlimit和setrlimit函数:每个进程都有一组资源限制,可以用这两个函数查询和更改。
#include<sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
struct rlimit{
rlim_t rlim_cur;/* 软限制 */
rlim_t rlim_max;/* 硬限制 */
};
更改资源限制时的原则:(1)、任何一个进程都可以将一个软限制改为小于等于硬限制的值;(2)任何一个进程都可以降低硬限制的值,但是必须大于等于软限制的值;(3)只有超级用户可以提升硬限制的值。
resource可以取得值有:RLIMIT_AS(进程可用存储区的最大总长度),RLIMIT_CORE(core文件的最大字节数),RLIMIT_CPU(CPU时间的最大量值)等等。(P165)