• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Crazy丶
享受现在的每一天........
博客园    首页    新随笔    联系   管理    订阅  订阅

文件I/O

lseek

每个打开的文件都由一个“当前文件偏移量”,是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都是从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。默认情况下,你打开开一个文件(open),除非指定O_APPEND参数,不然位移量被设为0.

select

之前的read函数可以监控一个文件描述符(eg:键盘)是否有输入,当键盘没有输入,read将会阻塞,直到用户从键盘输入为止。用相同的方法可以监控鼠标是否有输入。但想同时监控鼠标和键盘师傅有输入,这个方法就行不通了。 /dev/input/mice 是鼠标的设备文件 fd = open("/dev/input/mice", O_RDONLY); read(0, buf, 100); read(fd, buf, 100); 在上面的程序中,当read键盘的时候,若无键盘输入则阻塞在第2行,此时即使鼠标有输入,程序也没有机会执行第3行获得鼠标的输入。这种情况就需要select同时监控多个文件描述符。 需要包含的头文件:`` 函数原型:

int select(int maxfd, fd_set \* readset, fd_set \* writeset, fd_set \* exceptset, const struct timeval \* timeout)
返回值:失败返回-1,成功返回readset,writeset,exceptset中所有,有指定变化的文件描述符的数目(若超时返回0)

参数: maxfd:要检测的描述符个数, 因此值应为最大描述符+1 readset:被监控是否有输入的文件描述符集。不监控时,设为NULL writeset:被监控是否可以输入的文件描述符集。不监控时,设为NULL exceptset:被监控是否有错误产生的文件描述符集。不监控时,设为NULL timeval:监控超时时间。设置为NULL表示一直阻塞到有文件描述符被监控到有指定变化。

Tips:

readset,writeset,exceptset这三个描述符集指针均是值—结果参数,调用的时候,被监控描述符相应位需要置1;返回时,未就绪的描数字相应位会被清0,而就绪的会被置1。 下面的系统定义的宏,和select配套使用 FD_ZERO(&rset):将文件描述符集rset的所有位清0 FD_SET(4, &reset):设置文件描述符集rset的bit 4 FD_CLR(fileno(stdin), &rset):将文件描述符集rset的bit 0清0 FD_ISSET(socketfd, &rset):若文件描述符集rset中的socketfd位置1
posted @ 2015-07-12 15:53  Crazy丶  阅读(160)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3