Unix环境编程笔记1-1

上传人:豆浆 文档编号:24903153 上传时间:2017-12-08 格式:PDF 页数:11 大小:649.88KB
返回 下载 相关 举报
Unix环境编程笔记1-1_第1页
第1页 / 共11页
Unix环境编程笔记1-1_第2页
第2页 / 共11页
Unix环境编程笔记1-1_第3页
第3页 / 共11页
Unix环境编程笔记1-1_第4页
第4页 / 共11页
Unix环境编程笔记1-1_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《Unix环境编程笔记1-1》由会员分享,可在线阅读,更多相关《Unix环境编程笔记1-1(11页珍藏版)》请在金锄头文库上搜索。

1、day1郭镫鸿 新浪: 郭镫鸿Email: UC unix /linux C 学习方式:理解掌握最重要的20%课程内容: 回顾c,gcc 编译工具,库内存管理 文件如何管理进程管理 信号处理(中断)进程间通信 网络通信多线程作业: 银行项目unix/linux操作系统介绍linux:嵌入式 服务器pc机GUN计划POSIX标准GPL通用许可证版本:linux:是操作系统内核的名字 Fedora/Ubuntu是产品的名字,都是用linux内核书:错误处理:1.如果一个函数调用失败,错误如何处理(使用返回值):1)如果函数在正确的情况下,不可能返回负数,那么以返回-1代表出错2)如果函数返回的是指

2、针,以返回空指针代表函数出错。FILE *file = fopen(a.txt,r)if(file = NULL )出错3)函数不会返回值,或由参数返回结果,那么函数返回0代表成功执行,返回-1代表失败eg:#includefa(int n,int *r)if(n#includeint main()FILE *file = fopen(/etc/passwd,r+);if (file = NULL) printf(error); printf(失败原因是:%dn,error);用man errno.h 查看错误例如: printf(EACCESS: %d,EACCESS);打印出EACCESS

3、 是13printf(ERROR %sn,strerror(int errno)此函数在头文件#include中直接打印错误原因:printf(错误原因:%mn); perror(错误);使用fprintf();函数可以将错误信息写到文件中特别提示:不能使用errno的值来判断函数调用是否失败,由于errno的值会随时发生改变(因为是全局变量),当发现函数调用失败时,立即从errno中取失败原因,否则会被其他情况覆盖。3.环境表程序:可以执行的文件,存在磁盘上进程:正在运行的程序,存在内存中当shell启动进程时,会将一个环境表的地址传入进程,这个环境表中保存的是进程可以读取的所有环境变量。#

4、include#includeint mian() extern char* environ; printf(environ = %pn,environ); /environ 中存的是所有环境变量的地址char *p =environ;while(*p !=NULL) printf(%sn,p+);/打印出进程中的所有变量printf(-);/将环境变量LANG的值取出来保存到value中char vale100 = ;p = environ;while(*p) if(strnlscmp(*p,LANG,4) = 0)strcpy(value , *p +5); break; p+; prin

5、tf(value = %sn,value);return 0;4.内存管理1) 分配内存的一些方式:STL - 自动分配,自动释放 |输出sizeof(v) 为12;sizeof只关心类型C+ - new/delete 分配和释放内存 |C 语言 - malloc /free 分配和释放内存 | 平台无关的分配方式- 平台相关的分配方式类unix操作系统 - brk /sbrk |低层的内存分配 - mmap /munmap | 用户级-内核级内存分配方式 - kmalloc ,vmalloc|.|get_free_page();2) c语言和C+的内存分配情况 new /delete 有什么

6、区别new在分配内存的时候在内部调用malloc new在分配后调用构造函数(初始化对象),释放的时候调用析构函数(释放对象)new 和 delete 的重载程序变成进程3)进程空间的组成 当一个程序被调入内存中执行的时候,会变成一个进程,此空间被划分成以下几个区域:1)代码区: 代码区是只读的,程序试图修改代码区的内容会出现段错误,程序代码会被读入这个区域2)全局区 :除了代码区其他区域空间都是可读可写,全局区来给全局变量分配空间 别名:数据区,全局静态区3) BSS段 :紧接着全局区,给没有初始值的全局变量分配空间。当进程开始运行之前,BSS段会被清零一次,没有初始化的全局变量初始值为零4

7、) 堆区 用malloc new ,.分配的空间也叫自由区,想什么分配就什么时候分配,想什么释放,就什么时候释放。 分配的空间使用完必须释放,否则会内存泄露。5)栈区给局部变量(自动变量)分配空间的地方局部变量使用完内存空间会被释放,返回局部变量的地址无意义。局部变量内存的分配和释放都是自动的,用户无法干涉内存中进程空间分配:从上到下依次为:代码区 全局区 BSS段 堆区 栈区 程序实现:eg : memory.c#include#includeint i1 =10; /全局区int i2 = 20;/全局区int i3; / BSS段static int i4 = 40; / 全局区cons

8、t int i5 =50;/ 代码区void fa(int i6)/栈区int i7 = 70; /栈区static int i8 = 80;/全局区const int i9 = 90;/栈区char *str = abcdef;/代码区char str2 = ABCDEF;/栈区int *pi = malloc(4);/堆区printf(printf(printf(str=%pn,str);printf(str2=%pn,str2);printf(pi=%pn,pi);int main()printf(printf(printf(while(1); return 0;查看进程命令: cd /

9、proc ps aux (找到进程编号) ls cd 编号 堆区域可以有好几个eg: code.c #includeconst int ci =100;int main() char *str = abcdef;/str0 = A; /运行段错误 /strcpy(str,ABCDEF); / 运行出现段错误str = ABCDEF; /str 指向另一个字符串的地址printf(str = %sn,str);printf(-);char str2 = abcdef;str20 = A;printf(str2 = %sn,str2);strcpy(str2,ABCDEF);printf(str2

10、 = %sn,str2); printf(-);/以下都是错误的/str2 = ABCDEF 是错误的,数组名是常指针 不能赋值int * pi = (int * ) /ci在代码区不可更改*pi = 200;printf(/正确const int ci2 = 100;int * pi = (int * )printf(图解:-char str2 = abcdef;str20 = A;printf(str2 = %sn,str2);strcpy(str2,ABCDEF);printf(str2 = %sn,str2); /str2 = ABCDEF 是错误的,数组名是常指针 不能赋值图解:eg

11、3: stack.c#includeint main()int i1 = 10,i2 = 20 ,i3 = 30 ,i4 = 40;printf(printf(printf(*(pi+1) =100;printf(i3 = %dn,i3);printf(-);printf(以下程序嵌入式比较常用,内存转换);int x;/栈中分配了四个字节的空间x = 10;x = (int)abc;printf(x=%sn,x);double d;/8个字节的空间,首地址是char * str = printf(d = %sn,int get();int *p = get(); /悬空指针,不能使用printf(*p = %dn,*p);return 0;int *get()int num = 100;static int num = 100;/全局变量,使用完内存不释放return /栈中地址从后往前分配malloc /free 有什么区别回顾1.进程的内存空间size a.out(编译后的可执行文件) 可以查看内存中各个区域大小

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号