Прежде всего, извините за длинный вопрос. Я бы мог sh написать это короче. : (
Представьте, что в каталоге /path/to/dir
используется много одновременных созданий файлов с использованием linkat
и традиционным методом.
Следующие журналы получены из inotify-tools в Ubuntu.
Program A
создает файлы следующим образом и использует linkat API для создания файлов.
01:12 /path/to/dir OPEN #12323432
01:12 /path/to/dir MODIFY #12323432
01:12 /path/to/dir ATTRIB #12323432
01:12 /path/to/dir CREATE my_file_yy.txt
01:12 /path/to/dir CLOSE_WRITE,CLOSE #12323432
События Inotify, поступающие из Program A
, имеют странные имена файлов, такие как #12323432
, потому что этот файл открыт O_TMPFILE flag и Program A
добавил его содержимое. Как только это будет сделано, API linkat
используется для создания фактического файла в пользовательском пространстве, который равен my_file_yy.txt
.
Program B
создает файлы следующим образом и использует традиционный способ создания файлов.
01:13 /run/watson/incoming/ CREATE my_file_xx.txt
01:13 /run/watson/incoming/ OPEN my_file_xx.txt
01:13 /run/watson/incoming/ ATTRIB my_file_xx.txt
01:13 /run/watson/incoming/ CLOSE_WRITE,CLOSE my_file_xx.txt
Это создает файл с именем типа my_file_xx.txt
, добавляет его содержимое и закрывает файл. .
Я пишу Program C
, который подписывается на события CREATE
, CLOSE_WRITE
inotify
в каталоге /path/to/dir
. Размеры файлов, создаваемые Program A
и Program B
, могут быть любого размера. Большой размер файла занимает больше времени для записи на диск. Поэтому Program C
приходится ждать CLOSE_WRITE
событий inotify, чтобы убедиться, что запись выполнена, прежде чем начинать обработку файлов.
Программа A
, B
и C
- это независимые программы, которые запускаются одновременно, и мы не можем изменить что-либо в программе A
и B
.
Как связать фактические имена файлов, такие как my_file_yy.txt
, и безымянные имена файлов, такие как #12323432
, которые приходят из inotify
, когда файлы создаются с linkat
?
Надеялся, я объяснил это ясно.