Запись является одним из самых основных процедур , предусмотренных в Unix-подобных операционной системы ядра . Он записывает данные из буфера, объявленного пользователем, на заданное устройство, например в файл. Это основной способ вывода данных из программы с помощью системного вызова. Пункт назначения идентифицируется числовым кодом . Записываемые данные , например фрагмент текста, определяются указателем и размером в байтах.
write
таким образом принимает три аргумента:
- Код файла ( дескриптор файла или fd ).
- Указатель на буфер, в котором хранятся данные ( buf ).
- Количество байтов для записи из буфера ( nbytes ).
Использование POSIX
Интерфейс вызова записи [1] [2] [3] стандартизирован спецификацией POSIX. Данные записываются в файл путем вызова функции записи. Прототип функции:
ssize_t write ( int fd , const void * buf , size_t nbytes );
Аргумент | Описание |
---|---|
fd | Это дескриптор файла, полученный в результате вызова open. Это целое число. Значения 0, 1, 2 также могут быть заданы для стандартного ввода, стандартного вывода и стандартной ошибки соответственно. |
буф | Он указывает на массив символов, содержимое которого должно быть записано в файл, на который указывает fd. |
nbytes | Он определяет количество байтов, которые должны быть записаны из массива символов в файл, на который указывает fd. |
В синтаксисе выше ssize_t
это typedef
. Это подписанный тип данных, определенный в stddef.h
. Обратите внимание, что write()
не возвращает беззнаковое значение; он возвращает -1, если возникает ошибка, поэтому он должен возвращать значение со знаком.
Функция записи возвращает количество байтов, успешно записанных в массив, которое иногда может быть меньше указанного nbytes . Он возвращает -1, если обнаружено исключительное условие, см. Раздел об ошибках ниже.
Пример использования
#include #include #include #include #include int main ( int argc , char * argv []) { int fd1 ; char buf [ 128 ]; fd1 = open ( argv [ 1 ], O_WRONLY ); если ( fd1 == -1 ) { ошибка ( argv [ 1 ]); вернуть EXIT_FAILURE ; } / * Вводим данные для записи в файл * / scanf ( "% 127s" , buf ); написать ( fd1 , buf , strlen ( buf )); / * fd1 - дескриптор файла, buf - массив символов, используемый для хранения данных, strlen (buf) сообщает функции, что количество байтов, равное длине строки в буфере, необходимо скопировать * / закрыть ( fd1 ); возврат 0 ; }
Ошибки, обнаруженные во время работы
Ниже перечислены некоторые ошибки [4] [5], которые могут возникнуть при записи в файл. Ошибки - это макросы, перечисленные в errno.h .
Номера ошибок | Ошибка | Имея в виду |
---|---|---|
4 | EINTR | Системный вызов был прерван. |
5 | EIO | Ошибки низкого уровня, часто связанные с аппаратными операциями чтения / записи. |
9 | EBADF | Дескриптор файла fd недействителен, или предпринимается попытка записи в файл, открытый в режиме «только для чтения». |
13 | EACCES | У пользователя нет необходимых разрешений для записи в файл. |
14 | EFAULT | Адрес, указанный в функции, является недопустимым. |
22 | EINVAL | Аргументы, переданные с функцией, недействительны. |
27 | EFBIG | Размер файла, указанный в nbytes , слишком велик и превышает разрешенный системой. |
28 год | ENOSPC | Нет места для записи на запоминающее устройство. |
32 | EPIPE | Канал либо сломан, либо файл на другом конце канала не открыт для целей ввода-вывода (большинство процессов, выдающих этот тип ошибки, также генерируют сигнал SIGPIPE ). |
Функции ввода-вывода более высокого уровня, вызывающие запись
Системный вызов write - не обычная функция, несмотря на близкое сходство. Например, в Linux с архитектурой x86 системный вызов использует инструкцию INT 80H, чтобы передать управление ядру. [6] Системный вызов write и его аналог read , будучи функциями низкого уровня, способны распознавать только байты . Запись нельзя использовать для записи записей, например классов . Таким образом, требуются функции ввода-вывода более высокого уровня (например, printf ). Часто интерфейс высокого уровня предпочтительнее, чем загроможденный интерфейс низкого уровня. Эти функции вызывают внутри себя другие функции, а те, в свою очередь, могут выполнять вызовы записи, что приводит к многоуровневой сборке функций. [7] [8]
С помощью этой сборки функции более высокого уровня могут собирать байты данных и затем записывать требуемые данные в файл.
Смотрите также
Рекомендации
- ^ http://www.unix.com/man-page/FreeBSD/2/write/ Страница руководства для записи
- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives Примитивы ввода-вывода
- ^ http://pubs.opengroup.org/onlinepubs/007904875/functions/write.html
- ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html Руководство по библиотеке GNU C
- ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/ Ошибки списка страниц IBM
- ^ Программирование на языке ассемблера LINUX Боб Невельн ISBN 978-0-13-087940-0
- ^ https://www.gnu.org/s/libc/ Библиотека GNU C
- ^ http://ftp.gnu.org/gnu/glibc/ Загрузка библиотеки GNU C
Внешние ссылки
- POSIX написать
C_Programming / C_Reference / stdio.h / fwrite в Викиучебнике