函数名: 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)