Описание системного вызова

Системный вызов 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 (канал, труба, конвейер).