Архитектура операционной системы UNIX


         

READ - часть 6


Предположим, к примеру, что ядро выполняет два процесса, конкурирующие между собой (Рисунок 5.8). Если допустить, что оба процесса выполняют операцию open до того, как любой из них вызывает системную функцию read или write, ядро может выполнять функции чтения и записи в любой из шести последовательностей: чтение1, чтение2, запись1, запись2, или чтение1, запись1, чтение2, запись2, или чтение1, запись1, запись2, чтение2 и т.д. Состав информации, считываемой процессом A, зависит от последовательности, в которой система выполняет функции, вызываемые двумя процессами; система не гарантирует, что данные в файле останутся такими же, какими они были после открытия файла. Использование возможности захвата файла и записей () позволяет процессу гарантировать сохранение целостности файла после его открытия.

#include <fcntl.h> /* процесс A */ main() { int fd; char buf[512]; fd = open("/etc/passwd",O_RDONLY); read(fd,buf,sizeof(buf)); /* чтение1 */ read(fd,buf,sizeof(buf)); /* чтение2 */ | }

/* процесс B */ main() { int fd,i; char buf[512]; for (i = 0; i < sizeof(buf); i++) buf[i] = 'a'; fd = open("/etc/passwd",O_WRONLY); write(fd,buf,sizeof(buf)); /* запись1 */ write(fd,buf,sizeof(buf)); /* запись2 */ }

Рисунок 5.8. Процессы, ведущие чтение и запись файла

Наконец, программа на показывает, как процесс может открывать файл более одного раза и читать из него, используя разные файловые дескрипторы. Ядро работает со значениями смещений в таблице файлов, ассоциированными с двумя файловыми дескрипторами, независимо, и поэтому массивы buf1 и buf2 будут по завершении выполнения процесса идентичны друг другу при условии, что ни один процесс в это время не производил запись в файл "/etc/passwd".

Comments:

Copyright ©




Содержание  Назад  Вперед