написать (системный вызов)

редактировать

Запись является одним из самых основных процедур, предусмотренных в Unix-подобных операционной системы ядра. Он записывает данные из буфера, объявленного пользователем, на заданное устройство, например в файл. Это основной способ вывода данных из программы с помощью системного вызова. Пункт назначения идентифицируется числовым кодом. Записываемые данные, например фрагмент текста, определяются указателем и размером в байтах.

write таким образом принимает три аргумента:

  1. Код файла ( дескриптор файла или fd).
  2. Указатель на буфер, в котором хранятся данные ( buf).
  3. Количество байтов для записи из буфера ( nbytes).

СОДЕРЖАНИЕ

  • 1 Использование POSIX
  • 2 Пример использования
  • 3 Ошибки, возникшие во время работы
  • 4 функции ввода / вывода более высокого уровня, вызывающие запись
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки

Использование POSIX

Интерфейс вызова записи стандартизирован спецификацией 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, если возникает ошибка, поэтому он должен возвращать значение со знаком. Функция записи возвращает количество байтов, успешно записанных в файл, которое иногда может быть меньше указанного n байтов. Он возвращает -1, если обнаружено исключительное условие, см. Раздел об ошибках ниже.

Пример использования

#include lt;stdio.hgt; #include lt;string.hgt; #include lt;stdlib.hgt; #include lt;fcntl.hgt; #include lt;unistd.hgt; int main (int argc, char *argv[]) { int fd1; char buf[128]; fd1 = open(argv[1], O_WRONLY); if (fd1 == -1) { perror(argv[1]); 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; }

Ошибки, обнаруженные во время работы

Ниже перечислены некоторые ошибки, которые могут возникнуть при записи в файл. Ошибки - это макросы, перечисленные в 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 для передачи управления ядру. Системный вызов write и его аналог read, являясь функциями низкого уровня, способны понимать только байты. Запись нельзя использовать для записи записей, например классов. Таким образом, требуются функции ввода-вывода более высокого уровня (например, printf ). Часто интерфейс высокого уровня предпочтительнее, чем загроможденный интерфейс низкого уровня. Эти функции вызывают внутри себя другие функции, а те, в свою очередь, могут выполнять вызовы записи, что приводит к многоуровневой сборке функций.

С помощью этой сборки функции более высокого уровня могут собирать байты данных и затем записывать требуемые данные в файл.

Смотрите также

использованная литература

внешние ссылки

Последняя правка сделана 2023-04-13 07:39:08
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте