Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 158 из 715

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

#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. Процессы, ведущие чтение и запись файла

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

#include ‹fcntl.

|< Пред. 156 157 158 159 160 След. >|

Java книги

Контакты: [email protected]