Запись является одним из самых основных процедур, предусмотренных в Unix-подобных операционной системы ядра. Он записывает данные из буфера, объявленного пользователем, на заданное устройство, например в файл. Это основной способ вывода данных из программы с помощью системного вызова. Пункт назначения идентифицируется числовым кодом. Записываемые данные, например фрагмент текста, определяются указателем и размером в байтах.
write
таким образом принимает три аргумента:
Интерфейс вызова записи стандартизирован спецификацией 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 ). Часто интерфейс высокого уровня предпочтительнее, чем загроможденный интерфейс низкого уровня. Эти функции вызывают внутри себя другие функции, а те, в свою очередь, могут выполнять вызовы записи, что приводит к многоуровневой сборке функций.
С помощью этой сборки функции более высокого уровня могут собирать байты данных и затем записывать требуемые данные в файл.