Описание системного вызова
Системный вызов close предназначен для корректного завершения работы с файлами и другими объектами ввода-вывода, которые описываются в операционной системе через файловые дескрипторы: pipe, FIFO, socket.
Параметр fd является дескриптором соответствующего объекта, т, е. значением, которое вернул один из системных вызовов open(), pipe() или socket().
Возвращаемые значения
Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.
Пример программы для записи информации в файл
Для иллюстрации сказанного давайте рассмотрим следующую программу:
/* Программа, иллюстрирующая использование системных вызовов open(),write() и close() длязаписи информации в файл*/
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
int main(){
int fd;
size__t size;
char string[] = "Hello, world!";
/* Обнуляем маску создания файлов текущего процесса длятого, чтобы права доступа у создаваемого файла точно соответствовали параметру вызова open()*/
(void)umask(0);
/* Попытаемся открыть файл с именем myfile в текущей директории только для операций вывода. Если файла не существует, попробуем его создать с правами доступа 0666, т. е. read-write для всех категорий пользователей */
if((fd = open("myfile", O_WRONLY | O_CREAT, 0666)) < 0){
/* Если файл открыть не удалось, печатаем об этом сообщение и прекращаем работу */
printf("Can\'t open file\n");
exit(-1) ;
}
/* Пробуем записать в файл 14 байт из нашего массива, т.е. всю строку "Hello, world!" вместе с признаком конца строки */
size = write(fd, string, 14);
if(size != 14){
/* Если записалось меньшее количество байт, сообщаем об ошибке */
printf("Can\'t write all string\n");
exit (-1) ;
}
/* Закрываем файл */
if (close(fd). < 0) {
printf("Can\'t close file\n");
}
return 0;
}
Обратите внимание на использование системного вызова umask() с параметром 0 для того, чтобы права доступа к созданному файлу точно соответствовали указанным в системном вызове open().
Понятие неименованного канала. Системный вызов pipe()
Наиболее простым способом для передачи информации с помощью потоковой модели между различными процессами или даже внутри одного процесса в операционной системе UNIX является pipe (канал, труба, конвейер).