На уровне VFS все файлы являются виртуальными (на самом деле это было изобретено инженерами SunOS для связывания UFS (дисковой -на основе )и NFS (сетевой -на основе )файловой системы ). ].
Каждое открытое file
имеет таблицу функций f_op
, которые обеспечивают реализацию общих подпрограмм (некоторые из них могут быть общими )и каждый inode
имеет прикрепленный address_space
объект, который также имеет таблицу функций. C-функции (a_ops
), содержащие необходимые реализации. Последовательность такова:
sys_read()
:Приложение инициирует чтение файла с помощью системного вызова vfs_read()
)file->f_op->read()
, do_sync_read()
или new_sync_read()
a_ops->direct_IO()
, ext4_direct_IO()
дляext4
)и возвращаются данные file_get_page()
a_ops->readpage()
, что реализовано ext4_readpage()
из ext4
драйвера submit_bio()
Изhttp://myaut.github.io/dtrace-stap-book/kernel/fs.htmlон немного устарел, так как стек VFS был немного переработан после того, как я написал это
Я не знаю вашей точной ситуации из информации, которую вы публикуете, поэтому позвольте мне сначала ответить на некоторые из ваших концептуальных замешательств.
command or an interrupt we need a shell that will read and interpret our input. isn't that right?
Нет. Оболочка не требуется для передачи сгенерированного с клавиатуры -сигнала (, такого как Ctrl -C ). На прием клавиатуры -вырабатывается сигнал-
ваш процесс должен быть приоритетным процессом ;
ваш процесс должен иметь управляющий терминал .
Работающий процесс переднего плана заблокирует свой терминал и перехватит текущий ввод с терминала.
Как правило, процесс входа в систему запускается командой getty, процессы, запускаемые вашей -авторизацией в оболочке, используют терминал, указанный getty, в качестве управляющего терминала. Перед входом в системуваши ранние процессы инициализации по умолчанию используют терминал консоли ядра в качестве управляющего терминала.
Вы можете узнать больше об этом в главе 9 третьего издания APUE.
Возвращаясь к вашей ситуации, обычно программы в /etc/rc?.d могут получать сгенерированные клавиатурой -сигналы с терминала консоли ядра. Я предлагаю вам опубликовать свой сценарий инициализации, чтобы мы могли увидеть, как запускается ваша программа.
Надеюсь, это поможет.