以下是来自http://lxr.free-electrons.com/source/include/linux/dcache.h#L150的Linux dentry结构的片段。该struct包含一个成员struct qstr d_name - 下面的定义。我想知道这是否是在运行时对应于此dentry的特定文件的名称。令我困惑的是proc / PID / maps使用struct dentry_operations - > d_name(dentry的另一个成员)生成文件名...那么waht是struct qstr d_name的目的吗?请注意,我从纯粹的记忆内省观点(libvmi)接近这一点,因此我将成为"走路记忆"对于这些结构和使用C / C ++代码检索并不是那么简单。
ב- MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection) ב- System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) ב- MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection connection) ב- System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) ב- System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) ב- System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) ב- System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) ב- System.Data.Entity.Internal.LazyInternalContext.InitializeContext() ב- System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) ב- System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() ב- System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() ב- System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) ב- System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) ב- System.Data.Entity.DbSet`1.Add(TEntity entity) ב- MySqlWithEF.Program.Main(String[] args) ב- C:\Users\X7\Desktop\MyExampls C#\MySqlWithEF\Program.cs:שורה 24 ב- System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) ב- System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) ב- Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() ב- System.Threading.ThreadHelper.ThreadStart_Context(Object state) ב- System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ב- System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ב- System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) ב- System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:2)
Dentry的字段d_name
是一种简单(并且最常用)的方法,用于维护dentry的命名。在这种情况下,文件系统驱动程序需要指定一次dentry的名称,所有其他工作将由VFS完成。
但在某些情况下,静态分配的名称对于文件系统来说是不够的。正如您所注意到的,这是proc
文件系统的情况,它将每个进程信息展示到用户空间中。对于这种情况,方法->d_op->d_dname
存在。
d_path方法的实施有助于理解d_name
和d_op->d_dname
:
...
if (path->dentry->d_op && path->dentry->d_op->d_dname &&
(!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root))
return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
rcu_read_lock();
get_fs_root_rcu(current->fs, &root);
error = path_with_deleted(path, &root, &res, &buflen);
rcu_read_unlock();
...
如您所见,首先检查d_op->d_dname
方法的字段。如果它不是NULL,则使用该方法。否则,将读取d_name
字段。