Как использовать Readlink
Как использовать Readlink для получения значений.
1 ответ
Ответ:
Не делай этого
По крайней мере, не так, как вы предлагаете.
Вы указали решение здесь без указания того, что вы действительно хотите сделать [и почему?]. То есть каковы ваши потребности / требования? Предполагая, что вы получите это, что вы хотите сделать с именем файла? Вы опубликовали голый фрагмент своего пользовательского приложения, но не опубликовали ни одного кода своего ядра.
Как давний программист ядра, я могу сказать вам, что это не будет работать, не может работать, и это ужасный взлом. Существует огромное различие в методах, используемых внутри ядра и в пространстве пользователя.
/proc
строго для приложений пользовательского пространства, чтобы отслеживать данные ядра./proc
драйверы файловой системы предполагают пользовательское пространство, поэтому они всегдаcopy_to_user
, Данные будут записываться в адресное пространство пользователя, а не в адресное пространство ядра, поэтому это никогда не будет работать изнутри ядра.
Даже если бы вы могли использовать /proc
изнутри ядра это действительно ужасный способ сделать это.
Вы можете получить эквивалентные данные, но это немного сложнее, чем это. Если вы перехватываете read
системный вызов внутри ядра, у вас [уже] есть доступ к current
структура задачи и fd
номер, используемый в звонке. Исходя из этого, вы можете найти структуру для данного открытого файла и получить все, что хотите, напрямую, без участия /proc
совсем. Используйте это как отправную точку.
Обратите внимание, что для этого потребуется прочитать документацию ядра, источники драйверов файловой системы, системные вызовы и т. Д. Как заблокировать структуры данных и списки с помощью различных методов блокировки (например, RCU, блокировки rw, спин-блокировки). Кроме того, переменные для каждого процессора. Преимущества потоков ядра. Как правильно обходить необходимые списки и структуры, связанные с файловой системой, для получения необходимой информации. Все это, не вызывая блокировок, паники, ошибок по умолчанию, взаимоблокировок, UB на основе устаревших или противоречивых / динамически изменяющихся данных.
Вам нужно изучить все это, чтобы ознакомиться с тем, как ядро работает, и понять это, прежде чем пытаться делать что-то подобное. Если бы вы имели, вы бы прочитали исходный код /proc
водителей и уже известно, почему вещи не срабатывают.
В качестве предложения, забудьте все, что вы узнали о том, как работает приложение в пользовательском пространстве. Это не будет применяться здесь. Внутренне ядро организовано совершенно иначе, чем то, к чему вы привыкли.
Вам не нужно использовать readlink
внутри ядра в этом случае. Это то, как приложение пользовательского пространства должно было бы делать это, но в ядре это все равно, что проехать 100 миль, чтобы получить данные, которые у вас уже есть, и, как я упоминал ранее, даже не будет работать.