默然前行

write whatever i think.

read/write(1) -- read

函数名:
      read - 从文件描述字中读

摘要:

1 #include <unistd.h>
2 
3 ssize_t read(int fd, void* buf, size_t cnt);

描述:
      read()试图从文件描述字fd中读取cnt字节到以buf开始的缓冲区中。
      如果cnt为0,read()返回0并且buf中没有结果;如果cnt大于SSIZE_MAX,结果为定义。

返回值:
      如果成功,返回读取的字节数`ret'(非负,0代表遇到了文件结束符),并且文件位置前移ret字节。如果ret<cnt并不代表出错;例如,这种情况可能是由于当前只有ret字节可用(可能是因为已经接近文件结束,或者因为我们正从管道或终端中读取),也可能由于read()被信号中断。如果出错,返回-1。在这种情况下,文件位置是否改变是未定义行为。

错误号:
      EINTR   该调用在读完数据之前被信号中断。
      EAGAIN   用O_NONBLOCK选择了非阻塞模式I/O,但是当前没有数据可用。
      EIO      I/O错误。例如这种情况可能发生在当前进程为后台运行组,试图从它所控制的tty中读取,但是该终端为当前无效或者屏蔽了SIGTTIN信号又或者该终端进程为“孤儿进程”(orphan process)。 当从磁盘中读取数据时遇到底层I/O错误时,也会发生这种情况。
      EISDIR   fd引用了一个目录。
      EBADF   fd不是有效文件描述字,或者没有为读打开。
      EINVAL   fd引用了一个不支持读操作的设备。
      EFAULT   buf超出了可访问地址空间。
      其他错误也会发生,这取决于fd所连接的设备。 POSIX允许read调用在读取部分数据后被信号中断后,或者返回-1(错误号被置为EINTR),或者返回已经读取的字节数。

规范:
      SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3

约束:
      在NFS文件系统中,读取小量数据只在第一次时更新时间戳,而后续调用不会更新。这是由客户端属性缓存(client side attribute caching)导致的,因为绝大多数NFS客户端让server维护atime(最后访问时间),而客户端read调用所产生的读操作没有造成server端的读操作从而也不会导致server更新atime。可以通过禁用客户端属性缓存以获得UNIX语义,但事实证明大多数情况下这会增加server负载并降低性能。

参考:
      close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3), readv(3)

posted on 2008-09-12 10:01 Zech 阅读(1377) 评论(1)  编辑 收藏 引用 所属分类: unix

Feedback

# re: read/write(1) -- read[未登录] 2008-09-12 13:09 raof01

为你的努力鼓掌。
但是……我觉得这些没有必要翻译过来。一个合格的程序员,一定要feel comfortable with English。全世界都是如此  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理