Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура операционной системы UNIX1 / GLAVA_41
.HTM<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
<meta name="Description"
content="Ii?en A?. Aao, ia?aaia E??eiaa A. A.. 5.6 CLOSA
">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>5.6 CLOSЕ </title>
</head>
<body bgcolor="#FFF5EE" text="#000000" link="#FF0000"
vlink="#A52A2A" alink="#FF0000">
<div align="center"><center>
<table border="0" width="100%">
<tr>
<td> </td>
</tr>
</table>
</center></div>
<hr noshade width="90%">
<h3><a name="_6_6">5.6 CLOSЕ</a></h3>
<p>Процесс закрывает открытый файл,
когда процессу больше не нужно
обращаться к нему. Синтаксис вызова
системной функции close (закрыть): </p>
<pre> close(fd);</pre>
<p>где fd - дескриптор открытого
файла. Ядро выполняет операцию
закрытия, используя дескриптор
файла и информацию из
соответствующих записей в таблице
файлов и таблице индексов. Если
счетчик ссылок в записи таблицы
файлов имеет значение, большее, чем
1, в связи с тем, что были обращения к
функциям dup или fork, то это означает,
что на запись в таблице файлов
делают ссылку другие
пользовательские дескрипторы, что
мы увидим далее; ядро уменьшает
значение счетчика и операция
закрытия завершается. Если счетчик
ссылок в таблице файлов имеет
значение, равное 1, ядро освобождает
запись в таблице и индекс в памяти,
ранее выделенный системной
функцией open (алгоритм iput). Если
другие процессы все еще ссылаются
на индекс, ядро уменьшает значение
счетчика ссылок на индекс, но
оставляет индекс процессам; в
противном случае индекс
освобождается для переназначения,
так как его счетчик ссылок содержит
0. Когда выполнение системной
функции close завершается, запись в
таблице пользовательских
дескрипторов файла становится
пустой. Попытки процесса
использовать данный дескриптор
заканчиваются ошибкой до тех пор,
пока дескриптор не будет
переназначен другому файлу в
результате выполнения другой
системной функции. Когда процесс
завершается, ядро проверяет
наличие активных пользовательских
дескрипторов файла, принадлежавших
процессу, и закрывает каждый из них.
Таким образом, ни один процесс не
может оставить файл открытым после
своего завершения. </p>
<p align="center"><a name="5_10"></a> </p>
<div align="center"><center>
<table border="1">
<tr>
<td bgcolor="#C0C0C0"><pre><font size="2">
#include <fcntl.h>
main(argc,argv)
int argc;
char *argv[];
{
int fd,skval;
char c;
if(argc != 2)
exit();
fd = open(argv[1],O_RDONLY);
if (fd == -1)
exit();
while ((skval = read(fd,&c,1)) == 1)
{
printf("char %c\n",c);
skval = lseek(fd,1023L,1);
printf("new seek val %d\n",skval);
}
} |
</font></pre>
</td>
</tr>
</table>
</center></div>
<p align="center"><font size="2"><i>Рисунок 5.10.
Программа, содержащая вызов
системной функции lseek</i> </font></p>
<p><font size="2">На </font><a href="#5_11"><font size="2">Рисунке
5.11</font></a><font size="2">, например,
показаны записи из таблиц,
приведенных на </font><a href="pictures/5_4.gif"><font
size="2">Рисунке 5.4</font></a><font size="2">, после
того, как второй процесс закрывает
соответствующие им файлы. Записи,
соответствующие дескрипторам 3 и 4 в
таблице пользовательских
дескрипторов файлов, пусты.
Счетчики в записях таблицы файлов
теперь имеют значение 0, а сами
записи пусты. Счетчики ссылок на
файлы "/etc/passwd" и "private" в
индексах также уменьшились. Индекс
для файла "private" находится в
списке свободных индексов,
поскольку счетчик ссылок на него
равен 0, но запись о нем не пуста.
Если еще какой-нибудь процесс
обратится к файлу "private", пока
индекс еще находится в списке
свободных индексов, ядро
востребует индекс обратно, как
показано в </font><a href="glava_25.htm#_5_1_2"><font
size="2">разделе 4.1.2</font></a><font size="2">. </font><a
name="5_11"><font size="2"></font></a><font size="2"> </font></p>
<p align="center"><font size="2"><img src="pictures/5_11.gif"
width="520" height="601"> <br>
<i>Рисунок 5.11. Таблицы после
закрытия файла</i> </font></p>
<p align="center"><a href="glava_40.htm"><font size="2">Предыдущая
глава</font></a><font size="2"> || </font><a
href="contents.htm"><font size="2">Оглавление</font></a><font
size="2"> || </font><a href="glava_42.htm"><font size="2">Следующая
глава</font></a></p>
<p align="center"> </p>
</body>
</html>
Соседние файлы в папке Архитектура операционной системы UNIX1