设为首页 加入收藏

TOP

UNIX高级环境编程学习笔记
2015-02-25 16:15:34 来源: 作者: 【 】 浏览:60
Tags:UNIX 高级 环境 编程 学习 笔记

? ? Unix系统中主要的文件操作包括:


? ? unbuffered IO和standard I/O相对应,后面的章节我们会讨论这两者的区别。


? ? 在讨论open函数的时候,会引入原子操作,多进程通信(共享文件描述符)和内核相关的数据结构。?


? ? 对应内核来说,每一个打开的文件都对应一个非负整数。


? ? 有三个特殊的文件描述符:


? ? 对于较新的内核来说(Linux3.2.0,Solaris10等),文件描述符的数量并没有明确的限制,受限于内存的大小。?


UNIX环境高级编程中文第二版PDF高清版 下载地址? http://www.linuxidc.net/thread-2063-1-1.html


UNIX高级环境编程(第二版)源代码下载:http://www.linuxidc.net/thread-2069-1-1.html


? ? 常用的文件操作函数包括:open,read,write,lseek,close


函数声明:


返回值:


? ? OK:文件描述符(非负整数)


? ? Error:-1


注:参数列表中,“...”表示不同的系统和标准中,该处的参数可能不相同。


参数说明:


? ? path:文件名


? ? oflag:打开创建文件的属性。


? ? ? ? ? ? ? ?下面有五个必选的oflag参数值,这五个值有切只能选一个。另外还有若干个可选参数值,可以自行百度。


? ? ? ? ? ? ? ? NewImage


细节说明:


由open和openat返回的文件描述符保证为未使用的最小的文件描述。有的应用利用这一特性,先关闭标准输入描述符0,就可以在标准输入描述0上打开文件。


参数fd可以区分open和openat函数。其取值有三种可能:


?openat函数解决了两个问题:


这里介绍一下TOCTTOU错误。该类错误指的是,程序是非常脆弱的(vulnerable)如果该程序调用了两个文件相关的函数,第二个函数依赖于第一个函数的结果。因为两个函数是非原子操作,被操作的文件可能被两个函数轮流操作(线程切换),导致第一个函数的结果出错,从而程序出错。


函数声明:


?返回值:


?creat函数相当于下面这样调用open函数


creat有一点不方便,因为它打开的文件描述符是只读的,如果希望写入之后读回,需要依次调用creat、close和open,才能实现。


因此,在这种场景下,一个更好的打开文件的方法是像下面这样调用open函数:


open (path, O_RDWR | O_CREAT | O_TRUNC, mode);


函数声明:


返回值:


关闭一个文件会释放所有当前进程加在该文件上的记录锁。


每一个打开的文件都有一个”当前文件偏移量(current file offset)“,该偏移量是一个非负整数,记录了从文件开始到当前位置的字节数。


函数声明:


参数说明:


offset的作用取决于参数whence的值:


细节说明:


获取当前文件偏移量的方法:


lseek只记录当前文件在内核中的偏移量,并不会引起任何的IO操作。返回的offset将会在后面的read或write函数中使用。


偏移量可以比当前文件的长度大,这时,再调用write函数时,将扩展该文件的长度。这样的操作相当于在文件中建了一个洞,该洞范围内读时返回0。


?使用od命令可以看到文件中的hole


NewImage


?


函数声明:


返回值:


细节说明:


?在一些情况下,函数返回的字节数比指定的读入字节数要小,多数是因为读到了文件末尾,或者指定的读取位置中包含的字节数小于指定的读入字节数,这时,read返回的为可读到的字节数。


?


函数声明:


返回值:


?返回值总是等于参数nbytes的值,否则就会报错。


对于常规的文件来说,写操作总是从当前文件偏移量开始。?


简单地介绍了一下常用的文件IO操作,并介绍了一些使用上的细节,比较常规。


下一篇讲介绍更多文件IO的特性,包括:dup,fcntl,sync,fsync和ioctl函数。。


好久没写博客了,又第一次用mac下的一个博客软件写,不太熟悉,所以写的比较简单,以后会写的更努力。?


参考资料:


《Advanced Programming in the UNIX Envinronment 3rd》


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇排序算法(2) 堆排序 C++实现 下一篇HTML5-Canvas实例:刮刮乐游戏

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: