Linux系统接口幻灯片

上传人:爱****1 文档编号:930128 上传时间:2017-05-22 格式:PPT 页数:39 大小:3.13MB
返回 下载 相关 举报
Linux系统接口幻灯片_第1页
第1页 / 共39页
Linux系统接口幻灯片_第2页
第2页 / 共39页
Linux系统接口幻灯片_第3页
第3页 / 共39页
Linux系统接口幻灯片_第4页
第4页 / 共39页
Linux系统接口幻灯片_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《Linux系统接口幻灯片》由会员分享,可在线阅读,更多相关《Linux系统接口幻灯片(39页珍藏版)》请在金锄头文库上搜索。

1、上章回顾,Linux的文件模型,进程模型,与GNU程序更好的原因参数和选项,描述了命令行参数的解析技术系统的环境变量添加,删除,引用的方法如何创建共享库,使用共享库,以及共享库的工作原理,Linux系统接口,第5章,本章目标,理解Linux中文件描述符的概念,以及一切皆是文件的思想。熟练运用Linux提供的文件IO操作函数通过实例了解标准C库是通过系统调用来实现的掌握Linux中可执行程序的地址空间,以及malloc 库函数的一种简单实现。,本章结构,Linux系统接口,Unix/Linux地址空间,文件IO API,理解文件描述符,内存管理,实例:fopen与getc的实现,隐含内存分配函数

2、实例,实例:存储分配程序,其他常用API,低级IOread.write,Open/close与creat/unlink,随机访问-lseek,实例:目录列表,1-1 理解Linux文件描述符,“一切皆是文件”输入输出设备被看成文件输入输出通过读写文件完成读写文件之前做什么打开文件打开文件获得什么?Shell默认打开三个文件标准输入:0标准输出:1标准错误:2标准输入输出重定向你能确定输入从哪来?输出那里去?,文件描述符1.系统打开文件成功时返回的小的非负整数2.用户程序通过文件描述符引用文件,2-1低级IOread,write,#include ssize_t read(int fd,char

3、 *buf,size_t n);ssize_t write(int fd,char *buf,size_t n);,声明,代表文件的文件描述符,ssize_t与size_t的区别?前者是带符号的整型,后者是无符号整型,2-1低级IOread,write,#include #include int main()char bufBUFSIZ;int n; while (n = read(0, buf, BUFSIZ) 0) write(1, buf, n); return 0;,标准输入,标准输出,这个程序作用是什么,BUFSIZ的大小因系统各异,定义于stdio.h中,2-1低级IOread,w

4、rite,#include #include int getchar(void)char c; return (read(0, &c, 1) = 1) ? (unsigned char) c : EOF;,!,Getchar 函数返回的并不是char类型,而是int类型,在多数系统中的值为-1,所以决定了getchar的返回值是int,2-1低级IOread,write,带有缓冲的版本#include #include #undef getcharint getchar(void) static char bufBUFSIZ; static char *bufp = buf; static i

5、nt n = 0; if (n = 0) /* 缓冲区为空 */ n = read(0, buf, sizeof buf); bufp = buf; return (-n = 0) ? (unsigned char) *bufp+ : EOF;,从标准输入一次读取sizeof buf个字符至缓冲区,从缓冲区中返回一个字符,只有当缓冲区为空的时候,才从标准输入去读,因为在中定义了getchar这个宏,在这里重定义,所以需要undef,2-2 open/close与creat/unlink,声明,#include #include #include int open(char *name, int

6、 flags);或int open(char *name, int flags, mode_t mode);,成功返回文件描述符(非负数),失败返回负数。,O_RDONLYO_WRONLYO_RDWD. .,指明文件的权限,2-2 open/close与creat/unlink,声明,#include #include #include int creat(char *name, mode_t mode);,成功返回文件描述符(非负数),失败返回负数。,指明文件的权限,open()函数的flag | O_CREAT也可以用创建新文件,2-2 open/close与creat/unlink,简化

7、的cp程序if(f1 = open(argv1, O_RDONLY, 0) = -1)error(cp: cant open %s, argv1);if (f2 = creat(argv2, O_RDWR) = -1)error(cp: cant create %s, mode %03o, argv2, O_RDWR);while (n = read(f1, buf, BUFSIZ) 0)if (write(f2, buf, n) != n)error(cp: write error on file %s, argv2);,打开文件1和文件2,从f1读取BUFSIZ个字符到缓冲区,把读取缓冲区

8、中的数据写入到文件2,2-2 open/close与creat/unlink,#include int close(int fd);int unlink(const char *pathname);,声明,用open或creat函数返回的文件描述作为参数,意为关闭,之后文件描述符不可再用,注意此函数以文件路径名为参数,和remove库函数意义相同,成功返回0,失败返回-1,高质量的编程应该检查返回值。,2-3随机访问-lseek,读文件,写文件,read两个字节后,文件的位置在哪?,Read是指针自动向后移动,write两个字节后,文件的位置在哪?,Write也是指针自动向后移动,如果我想随机

9、的移动怎么办?,2-3随机访问-lseek,在文件中任意移动位置、而不读写数据。,#include #include off_t lseek(int fd, off_t offset, int whence);,取值为:SEEK_SETSEEK_CURSEEK_END,相对于whence的偏移量,返回相对于文件开始位置的偏移量,2-3随机访问-lseek,#include #include /*get: 从pos位置处读取n个字节 */int get(int fd, long pos, char *buf, int n)if (lseek(fd, pos, 0) = 0)return read

10、(fd, buf, n);elsereturn -1;,需要确保操作成功,这是常见的编程失误,2-4其他的常用文件IO API,2-4其他的常用文件IO API,2-5,2-6,实验用IO系统调用对标准库函数的简单实现,阶段总结,Linux的IO调用是通过文件描述符来操作文件的open,creat,read,write,unlink,lseek系统调用的用法其他的对目录或者文件常用API,3-1Unix/Linux地址空间,代码段存储可执行指令的区域数据段:初始化为非零的数据BSS:初始化为零的数据堆动态内存向上增长栈分配本地变量的地方大部分体系结构上是向下增长的,3-1Unix/Linux地

11、址空间,3-1Unix/Linux地址空间,使用ch05-memaddr程序演示,3-1系统调用sbrk和brk,声明,#include #include int brk(void *end_data_segment);void *sbrk(ptrdiff_t increment);,绝对逻辑地址,这个地址代表地址空间新的结尾,要增加的字节数,char *p = (char *) sbrk(0); if (brk(p + 32) s.ptr; ; prevp = p, p = p-s.ptr) if (p-s.size = nunits) if(p-s.size = nunits) prevp-s.ptr = p-s.ptr; else p-s.size -= nunits; p += p-s.size; p-s.size = nunits; freep = prevp; return (void *)(p+1); if (p = freep) if (p = morecore(nunits) = NULL) return NULL; ,

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

当前位置:首页 > 办公文档 > PPT模板库 > 教育/培训/课件

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