首页 > 代码库 > 第7章 进程环境

第7章 进程环境

  • main函数
main函数之前会有一个特殊的启动程序,启动例程从内核取得命令行参数和环境变量。
  • 进程终止
正常终止:
  1. 从main函数返回
  2. 调用exit
  3. 调用_exit或_Exit
  4. 最后一个线程从启动例程返回
  5. 最后一个线程调用pthread_exit
异常终止:
  1. 调用abort
  2. 接到一个信号终止
  3. 最后一个线程对取消请求作出相应
exit函数
_exit和_Exit直接进入内核,exit则先执行一系列清理处理(调用终止处理程序,关闭所有标准io流),然后进入内核
#include<stdlib.h>
void exit(int status);
void _Exit(int status);
#include<unistd.h>
void _exit(int status);
status 终止状态
atexit函数
登记函数
#include<stdlib.h>
int atexit(void (*func)(void));
exit调用这些函数的顺序与它们登记的顺序相反,登记多次也将执行多次
  • 命令行参数
调用exec的进程可将命令行参数传递给该新程序。
  • 环境表
extern char **environ;
  • C程序的存储空间布局
正文段:cpu执行的机器指令部分。可共享
初始化数据段:明确的赋初值的变量。
非初始化数据段:bss段,任何程序外的C声明
栈:自动变量以及每次函数调用时需要保存的信息
堆:动态存储的分配
size命令报告报告正文段/数据段/bss段
  • 共享库
动态链接
  • 存储器分配
#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);
  • 环境变量
#include<stdlib.h>
char *getenv(const char *name);
应使用geienv函数获取指点环境变量的值,而不是直接使用environ。
设置环境变量时只会影响当前进程及调用的子进程的环境,但不影响父进程的环境。
#include <stdlib.h>
int putenv(char *str);
int setenv(const char* name,const char *value,int rewrite);
int unsetenv(const char *name);
 
putenv将字符串直接放到环境表中,如果是自动变量会出现错误,
setenv分配存储区
  1. 修改现有的name
    • 如果新的value比原来的短或者相等,可以直接放到原来的存储区
    • 如果长,就需要malloc新的存储区
  2. 增加新的name
    • 如果是第一次,则需要分配新的环境表存储区,然后分配新的字符串存储区
    • 如果不是第一次了,就realloc环境表的存储区,然后直接分配新的字符串存储区就可以了。
  • setjmp和longjmp函数
goto是不能跨越函数的,只能在函数内部蹦达
#include<setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env,int val);
首先,用setjmp定位要跳到什么地方,setjmp返回的是longjmp第二个参数指定的数值,可以用来指定跳转意图。
env一般声明为全局变量,存储调用longjmp时能用来恢复栈状态的所有信息。
  • getrlinmit和setrlimit函数

第7章 进程环境