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

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

Позднее, процесс A попытается обратиться к несуществующему индексу, который уже был удален. Алгоритм namei, проверяющий в первую очередь неравенство значения счетчика связей нулю, сообщит об ошибке.

Такой проверки, однако, не всегда достаточно, поскольку можно предположить, что какой-нибудь другой процесс создаст в любом месте файловой системы новый каталог и получит тот индекс, который ранее использовался для «c». Процесс A будет заблуждаться, думая, что он обратился к нужному индексу (см. Рисунок 5.32). Как бы то ни было, система сохраняет свою целостность; самое худшее, что может произойти, это обращение не к тому файлу — с возможным нарушением защиты — но соперничества такого рода на практике довольно редки.

Рисунок 5.32. Соперничество процессов за индекс при выполнении функции unlink

#include ‹sys/types.h›

#include ‹sys/stat.h›

#include ‹fcntl.h›

main(argc, argv)

int argc;

char *argv[];

{

 int fd;

 char buf[1024];

 struct stat statbuf;

 if (argc != 2) /* нужен параметр */ exit();

 fd = open(argv[1], O_RDONLY);

 if (fd == -1) /* open завершилась неудачно */  exit();

 if (unlink(argv[1]) == -1) /* удалить связь с только что открытым файлом */  exit();

 if (stat(argv[1], &statbuf) == -1) /* узнать состояние файла по имени */

  printf("stat %s завершилась неудачно\n", argv[1]); /* как и следовало бы */

 else  printf("stat %s завершилась успешно!\n", argv[1]);

 if (fstat(fd, &statbuf) == -1) /* узнать состояние файла по идентификатору */

  printf("fstat %s сработала неудачно!\n", argv[1]);

 else  printf("fstat %s завершилась успешно\n", argv[1]); /* как и следовало бы */

|< Пред. 212 213 214 215 216 След. >|

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