Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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 如何拦截对文件系统的调用_C_Linux_Operating System - Fatal编程技术网

C 如何拦截对文件系统的调用

C 如何拦截对文件系统的调用,c,linux,operating-system,C,Linux,Operating System,我感兴趣的是拦截与文件系统相关的所有系统调用,而不是运行自己的代码。例如,对create、write、close、lseek、getcwd等的调用。我的目标是创建一个类似execve的函数,它捕获从派生程序到由调用进程管理的内存文件系统的所有文件I/O。这样,调用程序就可以在没有文件系统开销的情况下检查输出 我的用例使用的是没有API或库的大型数值模拟程序。这些程序仅通过输入和输出文件进行通信。如果这些文件很大,只进行I/O操作可能需要运行时的很大一部分时间。在某些计算机上,有超级用户权限,可以

我感兴趣的是拦截与文件系统相关的所有系统调用,而不是运行自己的代码。例如,对create、write、close、lseek、getcwd等的调用。我的目标是创建一个类似execve的函数,它捕获从派生程序到由调用进程管理的内存文件系统的所有文件I/O。这样,调用程序就可以在没有文件系统开销的情况下检查输出

我的用例使用的是没有API或库的大型数值模拟程序。这些程序仅通过输入和输出文件进行通信。如果这些文件很大,只进行I/O操作可能需要运行时的很大一部分时间。在某些计算机上,有超级用户权限,可以设置一个驻留在RAM中的文件系统(例如Linux上的tmpfs),但没有超级用户权限,或者以某种方式配置的计算机是不可能的

我知道使用LD_PRELOAD可以调用自定义代码而不是libc中的函数。但是,这只适用于动态链接的程序,它不能回答在调用程序(我想托管内存中的文件系统)和被调用方之间应该如何执行IPC的问题。这种方法的问题是如何最好地执行IPC。我应该使用管道、unix域套接字还是一些共享内存


我还将ptrace视为拦截系统调用的一种方法。这似乎可行,但我对这种方法有两个问题。首先,如何防止实际的系统调用发生(与我在一些示例中看到的仅修改系统调用的参数相反)。第二,ptrace是否允许高性能读取被叫方的内存空间?

使用
LD\u PRELOAD
,您可以在被叫方的内存空间中运行拦截代码。使用库构造函数(
\uuuu属性((构造函数))
),可以在库首次启动时运行您选择的代码,例如
mmap
初始化虚拟文件系统

然后,当您使用预加载的库截获调用时,该库的函数在目标进程中运行,可以访问构造的文件系统——不需要IPC

如果调用进程必须管理文件系统,那么与它通信将产生开销。我建议在子进程中映射文件系统的重要部分(可能作为共享内存区域),并在子进程中使用侦听器来监视来自父进程的文件系统更改(在文件系统操作周围使用适当的锁定)。由于带宽要求较低,您可以使用简单的管道进行更改通知


还有一个半虚拟化系统,它通过提供修改过的Glibc来沙盒文件系统访问。

Plash似乎不再存在。