Я не говорю, что нет никакого способа сделать это, но то, о чем @Jonathan говорит, не так ли.
Этот API предназначен для отслеживания создания, изменения и уничтожения файлов. В частности, этот инструмент используется такими вещами, как Spotlight, чтобы наблюдать активность в файловой системе новых интересных файлов.
Но, мудро, чтение не является одним из отслеживаемых событий.
И даже если чтение WAS отслеживается, это по-прежнему неправильный механизм, так как это система оповещения по факту, не соответствующая самому вызову.
Я серьезно сомневаюсь, что то, что вы хотите, возможно так, как вы это описываете.
С помощью Списков контроля доступа вы можете ограничить доступ на уровне пользователя (Фред может читать файл, но Боб не может). Это настройка самого файла. Но нет механизма, позволяющего Bobs App1 читать файл, в то время как Bobs App2 не может этого сделать, поскольку на самом деле не существует формального механизма «идентификации приложения», кроме выполняемой команды или чего-либо, что программа «говорит», его имя (оба из которых может быть подделан, если достаточно мотивирован).
Однако, не стесняйтесь сканировать источники Дарвина - без сомнения, ответ закопан где-то рядом с открытым (2) вызовом.
РЕДАКТИРОВАТЬ, относительно комментария.
Что вы пытаетесь сделать? Каков общий контекст?
Еще одна вещь, которую вы можете попробовать, это использовать FUSE.
FUSE - это утилита, которая позволяет вам иметь "файловые системы пространства пользователя". Люди используют FUSE для многих целей, таких как чтение томов NTFS или монтирование удаленной системы через SSH.
У них есть простой пример, который дает вам скелет, который вы можете заполнить для своих целей.
В большинстве случаев вы просто откладываете в систему. Однако для OPEN вы добавите свою логику. Затем вы можете указать вашей утилите FUSE каталог и «смонтировать его». Тогда все файлы в этом каталоге могут использовать ваше новое поведение.
Я все еще не уверен, как вы будете идентифицировать приложения по имени, но если это не настоящая проблема "безопасности", просто для локального контроля, я думаю, вы можете придумать что-нибудь. В Activity Monitor есть имена приложений, поэтому они должны быть доступны, и FUSE будет работать в пространстве процесса (я думаю), а не через какой-то внешний механизм.
С учетом всего вышесказанного, я думаю, что FUSE - ваша лучшая ставка, но, вероятно, это неуместно, если вы хотите сделать это для «любого файла» без предварительной подготовки пользователем (например, без установки FUSE). Если вы хотите сделать «любой файл», ваша система FUSE должна быть смонтирована в корне, и тогда у вас просто будет полный «клон» файловой системы, причем эти файлы из обычного корня «незащищены», а те от вашего нового FUSE root будет защищен. Так что, если кто-то хочет НЕ использовать вашу систему FUSE, реальный файл легко доступен для него через фактическое местоположение файла.