Написать (системный вызов) - Write (system call)

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

записывать таким образом принимает три аргумента:

  1. Код файла (дескриптор файла или же fd).
  2. Указатель на буфер где хранятся данные (бух).
  3. Количество байтов для записи из буфера (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]

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

Функции ввода-вывода высокого уровня, вызывающие запись

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

Рекомендации

  1. ^ http://www.unix.com/man-page/FreeBSD/2/write/ Страница руководства для записи
  2. ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives Примитивы ввода-вывода
  3. ^ http://pubs.opengroup.org/onlinepubs/007904875/functions/write.html
  4. ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html Руководство по библиотеке GNU C
  5. ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/ Ошибки списка страниц IBM
  6. ^ Программирование на языке ассемблера LINUX Боб Невельн ISBN  978-0-13-087940-0
  7. ^ https://www.gnu.org/s/libc/ Библиотека GNU C
  8. ^ http://ftp.gnu.org/gnu/glibc/ Библиотека GNU C Скачать

внешняя ссылка