1.进程终止
- 从main返回;
- 调用exit;
- 调用_exit或_Exit;
- 最后一个线程从其启动例程返回;
- 从最后一个线程调用ptherad_exit;
以上五种位正常终止。
- 调用abort;
- 接到一个信号;
- 最后一个线程对取消请求作出响应;
以上三种为异常终止。
其中_exit和_Exit立即进入内核,exit则会先执行一些清理处理,然后返回内核。
#include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);
2.命令行参数
#include <stdio.h> int main(int argc, char *argv[]) { int i; for(i = 0; i < argc; i++) { printf("argv[%d]:%s\n", i, argv[i]); } exit(0); }
假设进行名字为app,则运行./app arg1 TEST foo
运行结果:argv[0]:./app
argv[1]: arg1
argv[2]: TEST
argv[3]: foo
ISO C和POSIX.1都要求argv[argc]是一个空指针。所以可以讲参数处理循环改写为:
for(i = 0; argv[i] != NULL; i++)
3.C程序的存储空间布局
- 正文段:这是由CPU执行的机器指令部分,也就是函数。正文段是可共享的,因此在存储器中只需有一个副本,只读。
- 初始化数据段:也叫数据段,包含程序中需明确地赋初值的变量。比如全局变量。int i = 1;
- 未初始化数据段:也叫BSS段,在程序执行前,内核将此段中的数据初始化为0或者空指针。比如全局变量。long sun[10];
- 栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。说白就是局部变量以及函数调用的时候保存环境的地方。
- 堆:动态存储分配。
size命令可以查看当前一个进程的正文段、数据段等。eg:size /usr/bin/test
4.存储空间分配
- malloc:分配指定字节数的存储区。此存储区中的初始值不确定。
- calloc:为指定数量指定长度的对象分配存储空间,改空间中的每一位(bit)都初始化为0。
- realloc:增加或减少以前分配去的长度。当增加长度时,可能需将以前分配区的内容移动另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域的初始值不确定,会返回新的地址值。
#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);
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息。这意味着,如果超过一个已分配区的尾端或者在已分配区起始位置之前进行写操作,则会改写另一块的管理记录信息。
其他可能产生的致命性错误:
- 释放一个已经释放了的块;
- 调用free时所用指针不是3个alloc函数的返回值;
- 如果一个进程调用malloc函数,但却忘记调用free函数,那么该进程占用的存储空间就会连续增加,这被称为泄漏。如果不调用free函数释放不再使用的空间,那么进程地址空间长度就会慢慢增加,直至不再有空闲空间。此时,由于过度的换页开销,会造成性能下降。
5.函数setjmp和longjmp
在C中,goto语句不能跨越函数实现。函数setjmp和longjmp可以实现跨函数的跳转。(目前没有使用到,暂不深入了解)
6.函数getrlimit和setrlimit
目前没有使用到,暂不深入了解。
原文地址:https://www.cnblogs.com/zhuangquan/p/10717571.html
时间: 2024-11-11 16:45:34