Написать (системный вызов) - Write (system call)
В записывать один из самых основных распорядки предоставленный Unix-подобный Операционная система ядро. Он записывает данные из буфера, объявленного пользователем, на заданное устройство, например в файл. Это основной способ вывода данных из программы напрямую с помощью системного вызова. Пункт назначения обозначен значком числовой код. В данные быть написанным, например, кусок текста, определяется указатель и размер, выраженный в байтах.
записывать
таким образом принимает три аргумента:
- Код файла (дескриптор файла или же fd).
- Указатель на буфер где хранятся данные (бух).
- Количество байтов для записи из буфера (nbytes).
Использование POSIX
Интерфейс записи вызова[1][2][3] стандартизирован спецификацией POSIX. Данные записываются в файл путем вызова функции записи. Прототип функции:
ssize_t записывать(int fd, const пустота *бух, size_t nbytes);
Аргумент | Описание |
---|---|
fd | Это дескриптор файла, полученный в результате вызова open. Это целое число. Значения 0, 1, 2 также могут быть заданы для стандартного ввода, стандартного вывода и стандартной ошибки соответственно. |
бух | Он указывает на массив символов, содержимое которого должно быть записано в файл, на который указывает fd. |
nbytes | Он определяет количество байтов, которые должны быть записаны из массива символов в файл, на который указывает fd. |
В приведенном выше синтаксисе ssize_t
это typedef
. Это подписанный тип данных, определенный в stddef.h
. Обратите внимание, что записывать()
не возвращает беззнаковое значение; он возвращает -1 в случае ошибки, поэтому он должен возвращать значение со знаком.
Функция записи возвращает количество байтов, успешно записанных в массив, которое иногда может быть меньше указанного. nbytes. Он возвращает -1, если встречается исключительное условие, см. Раздел ошибки ниже.
Пример использования
#включают <stdio.h>#включают <string.h>#включают <stdlib.h>#включают <fcntl.h>#включают <unistd.h>int главный (int argc, char *argv[]){ int fd1; char бух[128]; fd1 = открыто(argv[1], O_WRONLY); если (fd1 == -1) { перрор(argv[1]); возвращаться EXIT_FAILURE; } / * Вводим данные для записи в файл * / сканф("% 127s", бух); записывать(fd1, бух, Strlen(бух)); / * 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 и его аналог читать, будучи функциями низкого уровня, способны понимать только байты. Запись нельзя использовать для записи записей, например классы. Таким образом, функции ввода-вывода более высокого уровня (например, 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 в Викиучебнике