进程环境
1.main() 函数和命令行参数
main()函数的原型
1 int main(int argc,char **argv); 2 3 int main(int argc,char *argv[]);
argc表示命令行参数,argv指向各参数的数组。
C语言规定:argv[0] 为启动该程序的程序名.
ANSI和POSIX.1均规定argv[argc]必须为空指针。
2.进程终止
Linux有8种方式使进程终止(termination)。
1 :5种正常终止
1)从main()返回:在main()中执行return 语句,可以将一个int值返回给程序调用者,一般是shell(系统调用者)。返回0表示程序正常终止,返回非0值表示程序异常终止。
2)调用exit:main函数执行return语句相当于调用exit(3)函数,exit(3)函数是专门用于进程终止的,它依赖于_exit(2)或_Exit(2)系统调用。程序的任何地方执行exit(3)都终止退出,但return只有在main()中才会终止进程,在其他函数中执行return只会退出当前函数。
3)调用_exit或_Exit:_exit(2) 和 _Exit(2) 函数都是系统调用,在程序中的任何地方调用它们程序都会立即结束。
(1) return 、exit(3)、_exit(2) 和 _Exit(2) 的返回值取值范围是多少呢?
(2) exit(3)、_exit(2) 和 _Exit(2) 之间有什么区别呢
4)从最后一个线程从其启动例程返回:待定
5)从最后一个线程调用pthred_exit.:待定
2.异常终止(文件不存在)
1)调用abort;abort()在头文件#include <stdlib.h>。该函数产生SIGABRT信号并发送给自己,默认情况下导致程序终止不成功的终止错误代码(错误代码的缺省值是3)返回到主机环境。
2)接受到一个信号:比如程序接收到 SIGINT(Ctrl+C) 信号就会结束,Ctrl + C 是 SIGINT 的一个快捷方式,而不是 Ctrl + C 触发了 SIGINT 信号。
3)最后一个线程对取消做出反应:待定
3.atexit()函数
函数原型:
1 #include <stdlib.h> 2 3 int atexit(void (*fun)(void));(void (*fun)(void))是一个无参无返回值得函数
atexit代码演练:
1 #include <stdio.h> 2 #inclue <stdlib.h> 3 4 void f1(void) 5 { 6 puts("this is f1"); 7 8 } 9 void f2() 10 { 11 puts("this is f2"); 12 13 } 14 void f3() 15 { 16 puts("this is f3"); 17 18 19 } 20 void f4() 21 { 22 puts("this is f4"); 23 24 } 25 int main() 26 { 27 puts("Begin"); 28 29 30 atexit(f1); /* 把这些函数挂到钩子上,等到程序正常结束时,再逆序地取下来去执行。 31 atexit(f2); *注意:程序正常结束时才会执行钩子函数,异常结束并不会执行。 32 atexit(f3); * 33 atexit(f4); */ 34 35 puts("End"); 36 37 exit(0); 38 }
结果:
1 Begin 2 End 3 this is f4 4 this is f3 5 this is f2 6 this is f1
4.环境表和环境变量
1)什么是环境变量和环境表
...环境变量就是一个变量:name = value,可以通过name来访问value;环境变量是全局的
1 PATH=/usr/local/bin 2 name value(字符串)
...环境表就是存放这些环境变量的表
历史上,大多数UNIX系统支持main函数带第三个参数,第三个参数为环境表。后来因为环境参数太好用了就独立出来了。 (全区变量environ)
int main(int argc, char *argv[], char *envp[]);

5.C程序的存储空间布局
一个C程序由text、data、bss段组成:
1)text段:

6.静态库和动态库(共享库)
动态库:
静态链接: gcc -static hello.c ls -lh a.out .......... 792K 动态链接: gcc hello.c ls -lh a.out ........ 8.1K
7.存储空间分配
8.函数setjump和longjmp
1 setjmp - save stack context for nonlocal goto 2 3 #include <setjmp.h> 4 int setjmp(jmp_buf env); 5 6 ongjmp, siglongjmp - nonlocal jump to a saved stack context 7 8 #include <setjmp.h> 9 void longjmp(jmp_buf env, int val);
9函数getrlimit和setrlimit
函数原型:
1 getrlimit, setrlimit - get/set resource limits 2 3 #include <sys/resource> 4 5 int getrlimit(int resource, struct rlimit *rlptr); 6 7 int setrlimit(int resource, const struct rlimit *rlptr);

浙公网安备 33010602011771号