unix环境高级编程学习
❶ UNIX环境高级编程——高级IO
在高级UNIX编程中,非阻塞I/O是提高程序响应性的重要手段。通过在open时设置O_NONBLOCK标志或使用fcntl调整文件状态,操作不会因为磁盘I/O延迟而陷入阻塞,而是立即返回错误信息,让开发者能够快速响应其他任务。
记录锁,或称字节范围锁,是UNIX系统确保文件一致性的重要机制。fcntl函数为我们提供了F_GETLK, F_SETLK和F_SETLKW等命令,通过flock结构管理锁,包括共享读锁(F_RDLCK)、独占写锁(F_WRLCK)和解锁(F_UNLCK)操作。它们遵循严格的规则:读锁不能锁定在已有写锁的位置,加锁要求与文件访问模式匹配,如读文件加读锁,写文件加写锁。
值得注意的是,频繁的读锁可能导致写锁请求阻塞,系统会智能地合并或拆分锁定区域。在使用lock_test或检查自身锁时,需要格外小心,因为F_GETLK命令不会报告进程自身的锁,以防替换现有锁定。
FreeBSD中的锁管理通过lockf结构与i节点关联,父进程关闭文件时会释放相关锁。对文件尾部操作时,需确保文件长度变化不会影响加锁范围。在数据库访问中,建议性锁与强制性锁的选择应根据应用场景,以保证数据一致性。
强制性锁提供了对数据库文件的严格保护,O_TRUNC或O_CREAT操作会因权限问题报错。I/O多路复用技术,如poll、pselect和select,能监控多个描述符的活动,select函数接收描述符集和等待时间,一旦条件满足即返回结果,包括“准备好”或“异常”状态。
理解文件尾挂断的区别,以及非阻塞描述符对select的影响,是异步I/O管理的关键。POSIX异步I/O不仅提供了非阻塞特性,还有可能遇到额外的设置和错误,如System V和BSD的异步实现差异。
异步操作的核心在于AIO控制块,它封装了文件描述符、偏移量、缓冲区等信息。通过aio_read和aio_write发起异步请求,完成后可能需要aio_return获取详细结果。SIGEV_NONE、SIGEV_SIGNAL和SIGEV_THREAD三种通知方式,允许用户定制异步操作完成的回调机制。
在初始化和操作异步I/O时,必须正确处理aio_read和aio_write的返回值,以及同步操作的aio_fsync和aio_error。同时,通过aio_suspend、aio_cancel和lio_listio等函数管理异步任务,确保任务的协调和及时取消。
存储映射I/O(如mmap)则是通过内存映射文件,提供高效的数据访问方式。当进行readn和writen操作时,需理解它们可能返回的数据量可能少于预期,但并不表示错误,只需继续后续操作即可。
通过这些高级技术,我们可以构建出更高效、响应快速的UNIX环境程序。深入理解这些概念对于高级编程至关重要,同时,相关习题如14.1-14.11提供了实战演练和深入学习的平台。
源码地址
❷ UNIX环境高级编程(第2版) UNIX网络编程(卷2):进程间通信(第2版)这两本书哪个好
我把三本都买了
环境高级编程:讲解unix api的,所以会涉及到其他两本的一些api,但讲解不多。
网络编程卷一:讲解套接字socket编程的,重点讲网络编程的方方面面,比如协议、服务器架构、io使用。
网络编程卷二:讲解进程间通信的,这是相对于卷一的,卷一是网络通信,而卷二是单台机子的进程、线程之间的通信。
=========================================================================
所以这三本都有不同侧重,我一般以卷一卷二为主,高级编程为辅,这三本都是工作后常用的资料书,建议备齐。
另外如有兴趣可以读该作者的另外3本书:tcp/ip协议详解卷一、二、三,尤其是卷一超级有用