1. main函数
main函数的原型是
int main(int argc,char * argv[],char *envp[]);
argc是命令参数个数,argv指向参数的各个指针所构成的数组,envp里存放的就是环境变量。当内核执行程序时,在调用main前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址,这是由连接器设置的,连接器由编译器调用。
2. 进程终止
在之前的linux学习里,介绍了进程终止,这里只是查漏补缺。
正常终止:
- 从main返回
- 调用exit
- 调用_exit或_Exit
- 最后一个线程从启动例程返回
- 最后一个线程调用pthread_exit
异常终止: - 调用abort
- 接到终止信号
- 最后一个线程对取消请求做出响应
而刚才提到的启动例程其实就是从main返回立即调用exit。
3. 环境表
其实环境表就是main函数的第三个参数,如果想访问环境变量,用getenv和putenv函数即可。
3.1 环境变量
用下面的函数就可以获取环境表中的环境变量:
#include<stdlib.h>
char *getenv(const char*name);
这个函数返回了的指针指向了name存储的val
而需要设置环境变量的话,需要下面的三个函数:
#include <stdlib.h>
int putenv(char *string);
int setenv(const char *name, const char *value, int overwrite);
int unsetenv(const char *name);
putenv函数是取形式为name = value的字符串,将其放到环境表,如果name已经存在,则删除原来的定义。
setenv函数是设置name为value,如果name存在,且overwrite部位0,则删除原来的定义,否则不删除。
unsetenv是删除name的定义。
那么修改函数环境表时是如何操作的?
- 修改一个现有的name
如果value长度小于等于现有的长度,直接插入修改,否则需要malloc为新字符串重新分配空间,然后将新字符串复制到该空间,并让name指向新分配区域。 - 增加一个新name
如果是第一次添加新的name,调用malloc为新的表开辟空间,将原来的环境表复制到新分配区域,并将指向name的指针放到表尾,并放置NULL指针在其后。
如果不是第一次添加新的name,则需要调用realloc,后续操作和上面的一样。