写入
外观
写入(write)是由类Unix操作系统内核提供的最为基本的程序。此程序从用户定义的缓冲中将数据写入设备或文件,这也是从程序中使用系统调用直接输出数据的主要方式。待写入的地点由文件描述符定义;要写入的数据(如文本)由指针和大小(字节数)定义。
write
也因此需要三个参数:
POSIX用法
[编辑]写入调用接口[1][2]根据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;
}
操作错误
[编辑]下方列出的是在写入文件时可能会发生的错误[3][4]。这些错误为errno.h中列出的宏命令。
错误数字 | 错误 | 意义 |
---|---|---|
4
|
EINTR
|
系统调用中断。 |
5
|
EIO
|
低级错误,通常与硬件的读取/写入操作有关。 |
9
|
EBADF
|
文件描述符fd无效,或是正尝试写入打开为“只读”模式的文件。 |
13
|
EACCES
|
用户没有写入文件的所需权限。 |
14
|
EFAULT
|
函数中指定的地址无效。 |
22
|
EINVAL
|
函数传递的参数无效。 |
27
|
EFBIG
|
指定于nbytes中的文件大小过大,且大于系统所允许的值。 |
28
|
ENOSPC
|
待写入至的存储设备上的存储空间不足。 |
32
|
EPIPE
|
管道损坏,或是在管道另一端的文件不可用于I/O(大多数抛出此错误的进程同时会产生SIGPIPE信号)。 |
调用写入的高级I/O函数
[编辑]虽然看起来很像,但写入系统调用不是一个普通的函数。例如在x86架构上的Linux系统上,此系统调用会使用INT 80H指令以将控制权转移给内核。[5]写入系统调用,及其配对函数读取(read)均是只能理解字节的低级函数。写入函数不可用于写入记录(如类)。因此,此时通常需要高级的输入输出函数(如printf)。通常与混乱的低级接口相比,程序员更偏好使用高级接口。这些函数在内部调用其他函数,反之也可做出写入调用,进而打造出了分层函数组合。[6]
有了这种组合,高级函数可收集数据的字节并随后写入文件。
参见
[编辑]- fwrite
- getchar
- fprintf
- pwrite ()
- read (system call)
- sync (Unix)
参考文献
[编辑]- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives (页面存档备份,存于互联网档案馆) I/O Primitives
- ^ 存档副本. [2019-05-03]. (原始内容存档于2018-10-10).
- ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html (页面存档备份,存于互联网档案馆) GNU C Library Manual
- ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/ (页面存档备份,存于互联网档案馆) IBM page listing errors
- ^ LINUX assembly language programming By Bob Neveln
- ^ http://ftp.gnu.org/gnu/glibc/ (页面存档备份,存于互联网档案馆) GNU C Library Download