Позднее, процесс 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 След. >|