- 1、本文档共51页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章文件I的O操作
* 5.2 不带缓存的文件I/O操作 5.2.4 文件的非阻塞操作 当文件打开时的flags包含O_NONBLOCK时,read/write就不会阻塞。 非阻塞方式下,当检测到数据没有到达时则立刻返回,减少了不必要的等待,提高了运行效率(例如使服务器充分得以利用)。 可以采用轮询的方式间隔执行read,例如每隔一段时间查询是否有输入,而不是始终处于阻塞状态,或不停地查询,做太多“无用功”。 * 5.2 不带缓存的文件I/O操作 5.2.4 文件的非阻塞操作 例5.9 程序以非阻塞的方式打开当前终端文件/dev/tty,每隔6秒检测终端是否有输入,若30秒后无输入则提示超时。 * 5.2 不带缓存的文件I/O操作 5.2.4 文件的非阻塞操作 例5.9 (续)程序以非阻塞的方式打开当前终端文件/dev/tty,每隔6秒检测终端是否有输入,若30秒后无输入则提示超时。 * 5.2 不带缓存的文件I/O操作 5.2.4 文件的非阻塞操作 例5.9 (续) * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 文件上锁可以避免对共享的资源产生竞争,发生读写错误。 文件锁分为建议性锁(使用flock函数)、强制性锁(使用fcntl函数) 可以用函数fcntl改变一个已打开的文件的属性,重设读、写、追加、非阻塞等标志 函数fcntl通过参数F_GETFL、F_SETFL分别获取、设置文件的属性。 例5.10 (略) * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 例5.11 在/root下打开名为”5-11file”的文件,如果该文件不存在,则创建此文件 打开文件后对其加上强制性的写入锁F_WRLCK,按回车后解锁F_UNLCK 然后加上读出锁F_RDLCK,按回车后再解锁F_UNLCK 在两个终端同时运行该程序,体会写入锁(强制锁)的独占性以及读出锁的共享性 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 例5.11(续) 时间 进程 1 加写入锁 等待 释放写入锁 等待 加写入锁 释放写入锁 加读取锁 加读取锁 释放读取锁 释放读取锁 进程 2 * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 flock结构体 //加锁的类型F_RDLCK, F_WRLCK, F_UNLCK //决定l_start的位置,分别为SEEK_SET, SEEK_CUR, SEEK_END; //指明锁定区域的开始位置 //锁定区域的长度 //加锁进程的ID 参考: /view/33869b211925a0.html fcntl函数原型: int fcntl(int fd, int cmd, struct flock *lock); fd为文件描述符 cmd为F_SETFL或F_GETFL;F_SETLK或F_GETLK lock所指向的结构体flock用于记录锁的具体状态 * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 例5.11(续) * 5.2 不带缓存的文件I/O操作 5.2.5 函数fcntl应用及文件上锁 例5.11(续) * 5.4 特殊文件的操作 5.4.1 目录文件的操作 目录文件的操作函数有 mkdir opendir closedir readdir scandir 例5.17打印指定目录下所有的文件或文件夹的名字(无递归形式) * 5.4 特殊文件的操作 5.4.1 目录文件的操作 例5.17(续)打印指定目录下所有的文件或文件夹的名字(无递归形式) opendir函数原型:DIR *opendir(const char *name); 打开参数name指定的目录,返回DIR指针 readdir函数原型:struct dirent *readdir(DIR *dir); 返回指向结构体dirent的指针,目录DIR当中下一个文件或目录的进入点 closedir函数原型:int closedir(DIR *dir); 关闭DIR目录 * 5.4 特殊文件的操作 5.4.1 目录文件的操作 结构体DIR(见教材P205-206页) 结构体dirent #include dirent.h struct dirent { long d_ino; /* ino_t, inode number 索引节点号 */
文档评论(0)