Архитектура операционной системы 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 След. >|