写入

写入（write）是由类Unix操作系统内核提供的最为基本的程序。此程序从用户定义的缓冲中将数据写入设备或文件，这也是从程序中使用系统调用直接输出数据的主要方式。待写入的地点由文件描述符定义；要写入的数据（如文本）由指针和大小（字节数）定义。

write也因此需要三个参数：

 文件代码（文件描述符或fd）；
 指向文件存储地的缓冲的指针（buf）；
 要从缓冲中写入的字节数（nbytes）。

 POSIX用法 
写入调用接口https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives  I/O Primitives根据POSIX规范定义。通过调用写入函数，数据才能写入文件。此函数的原型为： ssize_t write(int fd, const void *buf, size_t nbytes);
参数描述fd根据调用打开函数获取的文件描述符。此参数是一个可为0、1或2整数值，其值分别代表了标准输入、标准输出和标准错误。buf指向字符阵列，其内容为fd参数指向的文件。nbytes指定从字符阵列写入fd参数指向的文件的字节数。
在上述语法中，ssize_t是一个typedef（定义于stddef.h中带符号的数据类型）。但注意write()会在发生错误的时候返回-1（参见下方的错误一节），故其一定会返回带符号的值。
写入函数将返回成功写入数组的字节数，即意味着有时此值将小于指定的nbytes。

 使用示例 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main_gg (int argc, char *argv[])
{
    int fd1;
    char buf[128];
    fd1 = open(argv[1], O_WRONLY);
    if (fd1 == -1) {
        perror(argv[1]);
        return EXIT_FAILURE;
    }

    /* 输入待写入至文件的数据 */
    scanf("%127s", buf);

    write(fd1, buf, strlen(buf)); /* fd1为文件描述符，buf为用于存储数据的字符阵列，strlen(buf)用于通知函数缓冲中需要复制的字符串字节长度 */

    close(fd1);

    return 0;
}

 操作错误 
下方列出的是在写入文件时可能会发生的错误https://www.gnu.org/s/hello/manual/libc/Error-Codes.html  GNU C Library Manualhttp://www.ibm.com/developerworks/aix/library/au-errnovariable/  IBM page listing errors。这些错误为errno.h中列出的宏命令。
错误数字错误意义系统调用中断。EIO低级错误，通常与硬件的读取/写入操作有关。EBADF文件描述符fd无效，或是正尝试写入打开为“只读”模式的文件。用户没有写入文件的所需权限。EFAULT函数中指定的地址无效。EINVAL函数传递的参数无效。指定于nbytes中的文件大小过大，且大于系统所允许的值。ENOSPC待写入至的存储设备上的存储空间不足。管道损坏，或是在管道另一端的文件不可用于I/O（大多数抛出此错误的进程同时会产生SIGPIPE信号）。

 调用写入的高级I/O函数 
虽然看起来很像，但写入系统调用不是一个普通的函数。例如在x86架构上的Linux系统上，此系统调用会使用INT 80H指令以将控制权转移给内核。LINUX assembly language programming By Bob Neveln 写入系统调用，及其配对函数读取（read）均是只能理解字节的低级函数。写入函数不可用于写入记录（如类）。因此，此时通常需要高级的输入输出函数（如printf）。通常与混乱的低级接口相比，程序员更偏好使用高级接口。这些函数在内部调用其他函数，反之也可做出写入调用，进而打造出了分层函数组合。http://ftp.gnu.org/gnu/glibc/  GNU C Library Download

有了这种组合，高级函数可收集数据的字节并随后写入文件。
居中|缩略图|调用写入的高级I/O函数

 參見 
 fwrite
 getchar
 fprintf
 pwrite ()
 read (system call)
 sync (Unix)

 参考文献 

 外部链接 
 POSIX write 


Category:C POSIX library