write(2) - Linux man page

名称

write - 向文件描述符写入

概要

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

描述

write() 将最多 count 个字节从指向 buf 的缓冲区写入由文件描述符 fd 引用的文件。

写入的字节数可能小于 count,例如,如果底层物理介质上的空间不足,或者遇到 RLIMIT_FSIZE 资源限制(参见 setrlimit(2)),或者调用在写入少于 count 个字节后被信号处理程序中断。(另请参见 pipe(7)。)

对于可寻址文件(即可以应用 lseek(2) 的文件,例如,普通文件),写入发生在当前文件偏移量处,并且文件偏移量增加实际写入的字节数。 如果文件使用 O_APPEND 打开,则在写入之前,文件偏移量首先设置为文件末尾。 文件偏移量的调整和写入操作作为一个原子步骤执行。

POSIX 要求在 write() 返回后发生的 read(2) 能够返回新的数据。 请注意,并非所有文件系统都符合 POSIX 标准。

返回值

成功时,返回写入的字节数(零表示未写入任何内容)。 发生错误时,返回 -1,并且 errno 会被适当地设置。

如果 count 为零且 fd 引用的是普通文件,则如果检测到以下错误之一,write() 可能会返回失败状态。 如果未检测到任何错误,将返回 0,而不会产生任何其他影响。 如果 count 为零且 fd 引用的是除普通文件以外的文件,则结果未指定。

错误

EAGAIN
文件描述符 fd 引用的是除套接字以外的文件,并且已被标记为非阻塞 (O_NONBLOCK),并且写入会被阻塞。
EAGAINEWOULDBLOCK
文件描述符 fd 引用的是套接字,并且已被标记为非阻塞 (O_NONBLOCK),并且写入会被阻塞。 POSIX.1-2001 允许返回这两种情况下的错误,并且不要求这些常量具有相同的值,因此可移植的应用程序应检查这两种可能性。
EBADF
fd 不是有效的文件描述符,或者未打开用于写入。
EDESTADDRREQ
fd 引用的是一个数据报套接字,该套接字尚未使用 connect(2) 设置对等地址。
EDQUOT
引用 fd 的文件的文件系统上的用户磁盘块配额已用尽。
EFAULT
buf 超出了您可访问的地址空间。
EFBIG
尝试写入的文件超过了实现定义的最大文件大小或进程的文件大小限制,或者尝试在超过允许的最大偏移量处写入。
EINTR
在写入任何数据之前,调用被信号处理程序中断;参见 signal(7)
EINVAL
fd 附加到一个不适合写入的对象;或者文件使用 O_DIRECT 标志打开,并且 buf 中指定的地址、count 中指定的值或当前文件偏移量未正确对齐。
EIO
在修改 inode 时发生了低级 I/O 错误。
ENOSPC
包含 fd 引用的文件的设备没有空间用于数据。
EPIPE
fd 连接到一个读取端已关闭的管道或套接字。 发生这种情况时,写入进程也会收到 SIGPIPE 信号。(因此,只有在程序捕获、阻塞或忽略此信号时才能看到写入返回值。)

其他错误可能发生,具体取决于与 fd 连接的对象。

符合

SVr4, 4.3BSD, POSIX.1-2001。

在 SVr4 下,写入可能会在任何时候中断并返回 EINTR,而不仅仅是在写入任何数据之前。

说明

write() 成功返回并不能保证数据已提交到磁盘。 事实上,在某些有缺陷的实现中,它甚至不能保证已成功为数据保留空间。 确保的唯一方法是在写入所有数据后调用 fsync(2)

如果 write() 在写入任何字节之前被信号处理程序中断,则调用将以错误 EINTR 失败;如果它在写入至少一个字节后被中断,则调用将成功,并返回写入的字节数。

参见

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

引用自

aio(7), aio_error(3), aio_return(3), aio_write(3), archive_write(3), cpuset(7), dbopen(3), dsp56k(4), epoll(4), epoll(7), epoll_ctl(2), eventfd(2), explain(1), explain(3), explain_open_or_die(3), explain_write(3), explain_write_or_die(3), fclose(3), fflush(3), fgets(3), fio(1), fopen(3), fread(3), getpeername(2), getrlimit(2), hosts_options(5), htop(1), im_start_one(3), innxbatch(8), innxmit(8), io_canwrite(3), iostat(1), iv_fd_pump_pump(3), lam_rfposix(2), lamf_rfwrite(2), libexpect(3), libraptor(3), mcprint(3), mkfifo(3), mmap(2), mpool(3), ncl_cgm(3), nfslogsum(8), nttcp(1), perlfaq5(1), perlfunc(1), pidfile(3), pipe(2), pipethrough(3), pmcontextconnectto(3), prctl(2), pread(2), pth(3), putc(3), rmt(8), scrub(1), select_tut(2), send(2), sendfile(2), sg_dd(8), socket(2), socket(7), socketpair(2), spax(1), spew(1), spufs(2), spufs(7), st(4), stat(2), stdio(3), strace(1), tar_block_write(3), tar_extract_regfile(3), tevent_queue_tutorial(3), udp(7), vpsetcallback(3), vrb(3), vrb_write(3), vrb_write_min(3), x25(7), xdr(3), xfs_io(8), xfsctl(3), zfs(8)