Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux上拦截文件操作_C_Linux_Ld Preload - Fatal编程技术网

C 在Linux上拦截文件操作

C 在Linux上拦截文件操作,c,linux,ld-preload,C,Linux,Ld Preload,我正在开发一个云平台,用于渲染视觉效果和动画。我们接受各种形式的场景描述并渲染它们,然后将图像输出返回给用户。处理后端是Linux。有时我们会收到在Windows上生成的场景描述,因此我们会得到类似于“C:\path\to\file.mb”的路径。我编写了一个Linux共享库来拦截各种文件系统调用,并将路径更改为Linux可以理解的“/C/path/to/file”。我使用LD_预加载机制将我的函数插入到“真实”函数之前,效果非常好。。。除非它没有 例如,此命令: LD\u PRELOAD=/h

我正在开发一个云平台,用于渲染视觉效果和动画。我们接受各种形式的场景描述并渲染它们,然后将图像输出返回给用户。处理后端是Linux。有时我们会收到在Windows上生成的场景描述,因此我们会得到类似于“C:\path\to\file.mb”的路径。我编写了一个Linux共享库来拦截各种文件系统调用,并将路径更改为Linux可以理解的“/C/path/to/file”。我使用LD_预加载机制将我的函数插入到“真实”函数之前,效果非常好。。。除非它没有

例如,此命令:

LD\u PRELOAD=/home/robert/path\u fix.so Render-s1-e1 C:\path\to\test\u scene\u 03\u vray.ma

不会找到测试场景03\u vray.ma。这也不起作用:

LD\u PRELOAD=/home/robert/path\u fix.so echo test>C:\path\to\test.txt

我一直在使用ltrace来确定哪些函数是通过引用路径名来调用的,但这些示例没有显示在我的跟踪中:

ltrace-f-C-S-o ltrace.out渲染C:\path\to\test\u scene\u 03\u vray.ma

除了ltrace,是否有其他工具可以让我查看调用了哪些函数调用

以下是我已经拥有的覆盖的列表:

  • 福彭
  • 弗雷Open
  • opendir
  • 打开
  • 创造
  • 开放式
  • 统计
  • 伊斯塔特
  • 福斯塔特
  • __lxstat
  • __xstat
  • mkdir
  • 姆基拉特
  • 解除链接
  • 解开
  • 通路
  • faccessat
  • 改名
  • 改名吃
  • 重命名2
  • 奇莫德
  • fchmodat
  • 乔恩
  • 伊克霍恩
  • fchownat
  • 链接
  • 林卡特
  • 名称\u到\u处理\u在
  • 读链接
  • readlinkat
  • 符号链接
  • 符号链接
  • rmdir
  • chdir
这里还有我没有的功能吗?我试着实现所有需要的东西

常量字符*文件路径

作为论据

旁白:这似乎是一个已经解决的问题。。。是否有库或其他方法可以将Windows路径转换为unix友好路径?请记住,渲染应用程序是第三方专有二进制文件,因此我无法修改它们


谢谢你的建议

是的,还有其他函数,例如64位函数
open64()
。还有一些函数,如
\u open()

在64位Centos 7服务器上,仅需
open
I即可获得:

nm -D /lib64/libc.so.6  | grep open
0000000000033d70 T catopen
00000000003c0b80 B _dl_open_hook
000000000006b140 T fdopen
00000000000ba4c0 W fdopendir
00000000000755d0 T fmemopen
000000000006ba00 T fopen
000000000006ba00 W fopen64
000000000006bb60 T fopencookie
0000000000073700 T freopen
0000000000074b60 T freopen64
00000000000eb7a0 T fts_open
0000000000022220 T iconv_open
000000000006b140 T _IO_fdopen
0000000000077230 T _IO_file_fopen
0000000000077180 T _IO_file_open
000000000006ba00 T _IO_fopen
000000000006d1d0 T _IO_popen
000000000006cee0 T _IO_proc_open
0000000000131580 T __libc_dlopen_mode
00000000000e82a0 W open
00000000000e82a0 W __open
00000000000ed0f0 T __open_2
00000000000e82a0 W open64
00000000000e82a0 W __open64
00000000000ed110 T __open64_2
00000000000e8330 W openat
00000000000e8410 T __openat_2
00000000000e8330 W openat64
00000000000e8410 W __openat64_2
00000000000f7860 T open_by_handle_at
00000000000340b0 T __open_catalog
00000000000b9f70 W opendir
00000000000f12b0 T openlog
0000000000073ea0 T open_memstream
00000000000731c0 T open_wmemstream
000000000006d1d0 T popen
0000000000130630 W posix_openpt
00000000000e6ec0 T posix_spawn_file_actions_addopen
例如,在Linux上,此C代码很可能工作正常:

int fd = __open( path, O_RDONLY );

您也不会捕获静态链接的进程,或直接发出系统调用的进程,如
open

您可以从技术上使用kprobes拦截调用,但如果文件的数量不太多或动态生成,我建议创建符号链接。它更安全、更简单。

名称中的
\t
序列是否会导致故障?如果将名称括在单引号中会发生什么情况?您可能不需要修改stdio函数,如
fopen()
。他们最终调用Unix函数
open()
,因此会自动调用替换函数。