Скачиваний:
29
Добавлен:
01.05.2014
Размер:
5.46 Кб
Скачать
<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>&nbsp;</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 &lt;fcntl.h&gt;                                     
     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,&amp;c,1)) == 1)              
          {                                                 
               printf(&quot;char %c\n&quot;,c);                       
               skval = lseek(fd,1023L,1);                   
               printf(&quot;new seek val %d\n&quot;,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, а сами
записи пусты. Счетчики ссылок на
файлы &quot;/etc/passwd&quot; и &quot;private&quot; в
индексах также уменьшились. Индекс
для файла &quot;private&quot; находится в
списке свободных индексов,
поскольку счетчик ссылок на него
равен 0, но запись о нем не пуста.
Если еще какой-нибудь процесс
обратится к файлу &quot;private&quot;, пока
индекс еще находится в списке
свободных индексов, ядро
востребует индекс обратно, как
показано в </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">&nbsp;</p>
</body>
</html>
Соседние файлы в папке Архитектура операционной системы UNIX1