默然前行

write whatever i think.

unix I/O (2) -- write()

函数名:
      write - 向文件描述字写

摘要:
1 #include <unistd.h>
2 ssize_t write(int fd, const void* buf, size_t cnt);

描述:
      write()把缓冲区中从buf起的cnt字节写进文件描述字fd所引用的文件当中。POSIX要求,一个确定在write()返回后发生的read()调用会返回新的数据。注意,不是所有的系统都遵循POSIX标准。

返回值:
      如果成功,返回写入的字节数`ret'(非负,0表示没有字节写入)。如果错误,返回-1,同时errno置相应位。
      如果cnt为0并且fd引用一个常规文件(regular file),那么在检测到如下错误的时候write()将返回相应的错误号;没有检测到错误的时候,除返回0外不会有其他影响。如果cnt为0并且fd引用一个非常规文件,结果是未定义行为。

错误号:
      EAGAIN    用O_NONBLOCK选择了非阻塞式I/O但写动作被阻塞。
      EBADF    fd不是一个有效的文件描述字或者没有写打开。
      EFAULT    buf在可访问地址空间之外。
      EFBIG    或者是尝试写入一个超出了规定长度的文件,该长度或者是实现定义的最大文件长度,或者是进程文件长度限制。也可能是越过允许的最大文件偏移量进行写入。
      EINTR    调用在写入字节前被信号中断。
      EINVAL    fd引用一个不可写的设备;或该文件用O_DIRECT标志位打开,但是buf指定的地址、cnt的值、或者当前文件偏移量中存在不正确的对齐(align)
      EIO    修改inode的时候遇到了底层I/O错误
      ENOSPC    存放fd所引用文件的设备中没有足够的空间存放数据。
      EPIPE    fd引用的管道(pipe)或者socket的读端(reading reading)已被关闭。此情况发生时,写进程会收到一个SIGPIPE信号。(因为进程收到SIGPIPE的默认行为是终止程序,所以仅当程序捕获、屏蔽或者忽略了该信号时,此次写调用的错误值才可见。)
      其他错误也会发生,这取决于fd所引用的对象

规范:
      SVr4, BSD 4.3, POSIX.1-2001.
      在SVr4下,write()调用会在任意点上被中断,而不仅仅是在写入任何数据前。

注意:
      成功调用write()并不能保证数据别写入fd所引用的设备,只是提交内核。实际上,在一些存在bug的实现中,甚至不保证成功为数据预留所需空间。确保成功的唯一方法是在写入所有数据后调用fsync。

参考:
      close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)

posted on 2008-09-12 16:23 Zech 阅读(575) 评论(0)  编辑 收藏 引用 所属分类: unix


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