7.1 null
7.2 当内核执行C程序时(使用exec函数),调用main前先调用一个特殊启动例程。可执行程序文件将该例程指定为起始地址。例程从内核取得cmd参数和环境变量,然后启动main。
7.3 三个函数正常终止一个程序。_exit和_Exit立即进入内核,exit先执行一些清理(执行各终止处理程序,关闭所有标准I/O流等)。 exit(0);等价于return (0);
int atexit(void (*func) (void); 可以登记32个exit handler,同一函数可以多次注册。
7.4 ISO C和POSIX.1都要求argv[argc]是一个空指针。
7.5 每个程序都会收到一张环境表。与参数表一样也是字符指针数组。extern char **environ;
7.6 从历史上讲,C程序组成包含:(使用size命令可以查看各个段的长度。)
正文段:CPU执行的机器指令部分。
初始化数据段:程序中需明确赋初始值的变量。
非初始化数据段:出现在任何函数外的C声明long sum[1000];将使变量存放在此段中。
栈:自动变量,每次调用函数需保存的信息。
堆:动态存储分配。
7.7 动态链接可以减少文件大小。默认是动态,比如cc hello.c,如果要改成静态编译cc -static hello.c
7.8 动态分配内存。malloc,calloc,realloc,alloca(stack)。
7.9 char *getenv(const char *name);环境变量操作
int putenv(char *str);
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);
7.10 在C语言中,goto语句无法跨函数。
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
7.11 每个进程都有资源限制,其中一些可以用setrlimit和setrlimit查询和更改。
7.12 小结
7.2 当内核执行C程序时(使用exec函数),调用main前先调用一个特殊启动例程。可执行程序文件将该例程指定为起始地址。例程从内核取得cmd参数和环境变量,然后启动main。
7.3 三个函数正常终止一个程序。_exit和_Exit立即进入内核,exit先执行一些清理(执行各终止处理程序,关闭所有标准I/O流等)。 exit(0);等价于return (0);
int atexit(void (*func) (void); 可以登记32个exit handler,同一函数可以多次注册。
7.4 ISO C和POSIX.1都要求argv[argc]是一个空指针。
7.5 每个程序都会收到一张环境表。与参数表一样也是字符指针数组。extern char **environ;
7.6 从历史上讲,C程序组成包含:(使用size命令可以查看各个段的长度。)
正文段:CPU执行的机器指令部分。
初始化数据段:程序中需明确赋初始值的变量。
非初始化数据段:出现在任何函数外的C声明long sum[1000];将使变量存放在此段中。
栈:自动变量,每次调用函数需保存的信息。
堆:动态存储分配。
7.7 动态链接可以减少文件大小。默认是动态,比如cc hello.c,如果要改成静态编译cc -static hello.c
7.8 动态分配内存。malloc,calloc,realloc,alloca(stack)。
7.9 char *getenv(const char *name);环境变量操作
int putenv(char *str);
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);
7.10 在C语言中,goto语句无法跨函数。
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
7.11 每个进程都有资源限制,其中一些可以用setrlimit和setrlimit查询和更改。
7.12 小结