第7章 进程环境
- main函数
main函数之前会有一个特殊的启动程序,启动例程从内核取得命令行参数和环境变量。
- 进程终止
正常终止:
- 从main函数返回
- 调用exit
- 调用_exit或_Exit
- 最后一个线程从启动例程返回
- 最后一个线程调用pthread_exit
异常终止:exit函数
- 调用abort
- 接到一个信号终止
- 最后一个线程对取消请求作出相应
_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分配存储区
- 修改现有的name
- 如果新的value比原来的短或者相等,可以直接放到原来的存储区
- 如果长,就需要malloc新的存储区
- 增加新的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函数
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。