cha7--进程环境

一、main()函数

1.函数原型int main(int argc, char *argv[])

 

2.参数:argc:命令行参数的数目;argv[]:指向参数的各个指针构成的数组

 

二、进程终止

1.有8种进程终止方式,5种正常终止,3种异常终止

(1)正常:

A.从main()函数返回

 

B.调用exit:先执行清理处理(标准I/O库的清理关闭,对所有打开流调用fclose()),后返回内核

<stdlib.h>: void exit(int status);

 

C.调用_exit/_Exit:立即进入内核

<stdlib.h>: void _Exit(int status)

<unistd.h>: void _exit(int status)

 

D.最后一个线程从其启动历程返回

 

E.从最后一个线程调用pthread_exit

 

(2)异常:

A.调用abort

 

B.接到一个信号

 

C.最后一个线程对取消请求做出响应

 

2.退出函数:

(1)main()返回一个整型值==用该值调用exit()exit(0) == return 0;

 

(2)终止状态:exit status;shell命令echo $?输出终止状态

A.未知:调用返回函数不带终止状态;main()执行了无返回值的return语句;main()未声明返回类型为整型

 

B.为0:main()返回类型为int,并且main()返回

 

3.atexit():登记终止处理程序(exit()自动调用)

(1)header: <stdlib.h>

(2)int atexit(void (*func) (void));

(3)parameter: 函数地址

(4)成功返回0,不成功返回非0

(5)exit()调用这些函数顺序与他们登记顺序相反,多次登记多次调用

(6)内核使程序运行的唯一方法:调用exec();进程自愿终止唯一方法:显式/隐式(调用exit())的调用_exit()/_Exit()

 

三、命令行参数

1.argv[argc]要求为空指针

 

四、环境表

1.对于函数staticextern的区别:static使得函数旨在本文件内部有效,对其他文件不可见,静态函数extern表示函数为外部函数,可供其他文件调用,使用其他文件中定义的外部函数,使用extern声明即可

 

2.环境表:字符串指针数组,每个指针包含一个以null结尾的c字符串的地址

 

3.环境指针:extern char **environ,包含了环境表的地址

 

4.ISO C规定main()只能有两个参数,POSIX.1规定应使用environ代替环境表地址

 

五、C程序的存储空间布局

1.c程序组成部分:

(1)正文段:右cpu执行的机器指令部分,可共享,只读

(2)初始化数据段:包含了程序中需要明确赋初值的变量(任何函数之外的声明)

(3)未初始化的数据段(bss):程序开始执行前,内核将此段的数据初始化为0/空指针

(4)栈:自动变量以及每次函数调用时所需保存的信息;栈从高地址向低地址方向增长

(5)堆:动态存储分配(位于bss和栈之间)

 

2.存放在磁盘程序文件中的:正文段,初始化数据段

 

3.Linux-size命令报告正文段、数据段、bss段长度

 

六、共享库

1.使得可执行文件不再需要包含公用的库函数,只需在所有进程都可引用的存储区中保存这种库例程的一个副本

 

2.程序第一次执行/第一次调用某个库函数,用动态链接的方法将程序与共享库函数相链接

 

3.优点:减少了可执行文件的长度;可以用库函数的新版本代替老版本而无需对使用该库的程序重新连接编辑(参数数目和类型)

 

七、存储空间分配

1.ISO C说明了3个用来动态分配存储空间的函数:<stdlib.h>

(1)malloc():分配指定字节的存储区,初始值不确定

void *malloc(size_t size);

(2)calloc():为指定数量、长度的对象分配存储空间,每一位都初始化为0

void *calloc(size_t nobj, size_t size);

(3)realloc():增加/减少之前分配区的长度

void *realloc(void *ptr, size_t newsize);

void free(void *ptr);

(4)返回值:成功:非空指针;失败:NULL

 

2.替代的存储空间分配程序:libmalloc, vmalloc, quick-fit, jemalloc, TCMalloc, alloca

(1)alloca():在当前函数的栈帧上分配存储空间,而不在堆中

A.优点:函数返回,自动释放它使用的栈帧

B.缺点:增加了栈帧的长度

 

八、环境变量(name = value)

1.char *getenv(const char *name); 取环境变量的值

(1)头文件:<stdlib.h>

 

2.ISO C 没有定义任何环境变量

 

3.设置环境变量函数:<stdlib.h>

(1)int putenv(char *str);

A.取形式为name = value的字符串,放到环境表中,如果name已存在,先删除其原来的定义

B.成功返回0,否则返回非0

C.可以自由地将传递给他的字符串直接放到环境中

(2)int setenv(const char *name, const char *value, int rewrite);

A.将name设置为value. 如果name已存在,先删除现有定义(rewrite != 0),不删除旧值也不赋新值

B.需要分配存储空间

(3)int unsetenv(const char *name);

A.删除name的定义,不存在也不出错

 

4.环境表和环境字符串通常存放在进程存储空间的顶部

(1)增加一个字符串比较困难。因为占用顶部,不能再向更高地址扩展;下面是栈帧,也无法向更低地址方向扩展

 

九、函数setjmp()和longjmp():处理发生在深层嵌套函数调用中的出错情况,进程中非局部转移

1.goto语句不能跨越函数,setjmp和longjmp为非局部(在栈上跳过若干调用帧,返回到当前函数调用路径上的某个函数中)goto

 

2.<setjmp.h>

(1)int setjmp(jmp_buf env);放在需要返回的上层函数中

A.直接调用(将所需的信息记入变量env),返回0;从longjmp返回,返回非0

B.在希望返回到的位置调用setjmp()

C.jmp_buf是某种形式的数组,存放在调用longjmp时能用来恢复栈状态的所有信息

D.需要在另一个函数中引用env,通常将env定义为全局变量

(2)void longjmp(jmp_buf env, int val);放在发生错误的下层函数中

A.检查到错误时,调用long_jmp()

B.val值非0,作为setjmp()的返回值,区分多个longjmp()

 

3.longjmp()返回后,变量的值未知

 

十、函数getrlimit()和setrlimit():查询/更改进程的资源限制

1.<sys/resource.h>

Int getrlimit(int resource, struct rlimit *rlptr);

Int setrlimit(int resource,  const struct rlimit *rlptr);

(1)成功返回0,否则非0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章