跳转到内容

C 编程/POSIX 参考/unistd.h/write

来自维基教科书,开放的书籍,面向开放的世界

write 系统调用将数据(以调用者指定的字节为单位)从程序中用户声明的缓冲区写入调用进程提供的文件。在大多数现代操作系统中,需要将数据写入文件系统中存储的文件的程序使用 Write 系统调用。文件由从先前调用 open 获取的文件描述符标识。

因此,Write 接受三个参数

  1. 文件的 文件描述符(fd)。
  2. 将数据写入文件的缓冲区(buf)。
  3. 要从缓冲区读取的字节数(nbytes)。

POSIX 用法

[编辑 | 编辑源代码]

write 系统调用接口[1][2][3] 由 POSIX 规范标准化。通过调用 write 函数将数据写入文件。函数原型为 

 ssize_t write(int fd, const void *buf, size_t nbytes);
参数 描述
fd
这是从对 open 的调用中获得的文件描述符。它是一个整数值。值 0、1、2 分别可以用于标准输入、标准输出和标准错误。
buf
它指向一个字符数组,该数组可用于存储从 fd 指向的文件中获取的内容。
nbytes
它指定要从文件写入字符数组的字节数。

在上面的语法中,ssize_t 是一个 typedef。它是在 sys/types.h 中定义的带符号数据类型。sizeof 运算符生成一个类型为 size_t 的整数值。[4]
write 函数返回成功写入数组的字节数,该字节数有时可能小于指定的 nbytes。如果遇到错误,它将返回 -1。

使用示例

[编辑 | 编辑源代码]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    int fd1;
    char buf[128];
    fd1 = open(argv[1], O_WRONLY | O_CREAT);
    if (fd1 == -1) {
        perror("File cannot be opened");
        return EXIT_FAILURE;
    }

    /* Enter the data to be written into the file */
    scanf("%127s", buf);
   
    write(fd1, buf, strlen(buf)); /* fd1 is the file descriptor, buf is the character array used to 
 hold the data, strlen(buf) informs the function that the number of bytes equal to the length of the 
 string in the buffer need to be copied */
 
    close(fd1);
    return 0;
}

操作期间遇到的错误

[编辑 | 编辑源代码]

以下列出了一些[5][6] 在写入文件时可能遇到的错误。这些错误是在 errno.h 中列出的宏。

错误编号 错误 含义
5
EIO
低级错误,通常与硬件读/写操作有关。
9
EBADF
文件描述符 fd 无效,或正在尝试写入以“只读”模式打开的文件。
14
EFAULT
函数中指定的地址是无效地址。
22
EINVAL
与函数一起传递的参数无效。
28
ENOSPC
磁盘上没有可用空间进行写入。

参考文献

[编辑 | 编辑源代码]
  1. http://www.unix.com/man-page/FreeBSD/2/write/ Write 手册页
  2. http://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I/O 原语
  3. http://pubs.opengroup.org/onlinepubs/007904875/functions/write.html
  4. C 编程语言。Brian Kernighan & Dennis Ritchie. 印度:PHI Learning Private Limited. ISBN 978-81-203-0596-0.
  5. http://www.gnu.org/s/hello/manual/libc/Error-Codes.html GNU C 库手册
  6. http://www.ibm.com/developerworks/aix/library/au-errnovariable/ IBM 列出错误的页面
[编辑 | 编辑源代码]
华夏公益教科书