tcl";开放式;用重复文件替换Tcl_文件系统时命令不起作用

tcl";开放式;用重复文件替换Tcl_文件系统时命令不起作用,c,tcl,tcl-api,C,Tcl,Tcl Api,我正在尝试使用Tclapi为Tcl编写一个定制的文件系统(它与工作相关,不会详细介绍),但我一直在试图弄清楚为什么这不起作用 在这个代码段中,我获取原始/本机Tcl_文件系统,将其所有内容(函数指针)复制到my_fs,然后在my_fs上调用Tcl_FSRegister。很简单,我觉得应该可以 // global scope const Tcl_Filesystem *ori_fs; Tcl_Filesystem *my_fs; ... // in Init // Get the origi

我正在尝试使用Tclapi为Tcl编写一个定制的文件系统(它与工作相关,不会详细介绍),但我一直在试图弄清楚为什么这不起作用

在这个代码段中,我获取原始/本机Tcl_文件系统,将其所有内容(函数指针)复制到my_fs,然后在my_fs上调用Tcl_FSRegister。很简单,我觉得应该可以

// global scope
const Tcl_Filesystem *ori_fs;
Tcl_Filesystem *my_fs;

...

// in Init

// Get the original Tcl_Filesystem.
Tcl_Obj *root_obj = Tcl_NewStringObj("/", -1);
Tcl_IncrRefCount(root_obj);
ori_fs = Tcl_FSGetFileSystemForPath(root_obj);
Tcl_DecrRefCount(root_obj);

// create a duplicate of the original Tcl_Filesystem struct.
my_fs = malloc(sizeof(Tcl_Filesystem));
memmove(my_fs, ori_fs, ori_fs->structureLength);

int ret = Tcl_FSRegister((ClientData)1, my_fs);
if (ret == TCL_ERROR) {
...
当我跑的时候

load <path to .so>/my_fs[info sharedlibextension]

# sanity check
puts [pwd]

set fp [open test.txt]
load/my_fs[info sharedlibextension]
#健康检查
puts[pwd]
设置fp[opentest.txt]
然而,我明白了

<my current directory>

while executing
"open test.txt"
    invoked from within
"set fp [open test.txt]"
    (file "test.tcl" line 3)

执行时
“打开test.txt”
从内部调用
“设置fp[open test.txt]”
(文件“test.tcl”第3行)
注意“puts[pwd]”是如何工作的,而不是“opentest.txt”

在调用Tcl_FSRegister时,将“my_fs”替换为“ori_fs”似乎有效。。。
我已经花了太多时间想弄明白这一点。如果有人能帮我,我将不胜感激

本机文件系统是特殊的。特别是,在某些地方可以直接使用其标识:例如,它是唯一可以在其上创建临时文件的FS,假定它拥有根,并且在路径管理中专门处理它。(好吧,根据源代码中的位置,直接引用Tcl内部变量
tclNativeFilesystem
,这不是可以欺骗的。它也可能位于只读内存中,因此您无法绕过它。)

对于大多数正常使用Tcl虚拟文件系统的人来说,这并不重要。临时文件必须是本机文件,因为您可能会将它们传递给操作系统(例如,用于加载VFS中的库或运行程序;使用这些文件时,必须将它们复制出来,否则操作系统会想“你在说什么?!”),然后将要挂载的内容放在本机根以外的其他位置。只要您不尝试使用VFS作为安全措施(不推荐;有安全的解释器,因为它们提供了更强大的沙箱解决方案),这应该不会是一个问题,因为您可以让代码知道它需要在特定位置下工作才能完成任务。(FWIW,无论如何
cd
都不是一个好主意,除了响应用户请求之外,因为它改变了用户提供的相对路径的含义,所以好的代码从一开始就处理“使所有内容都相对于定义的位置”)