我希望能够从我启动的任何子进程中拦截带有特定前缀的文件名。这将是像“pipe://pipe_name”这样的名称。我认为包装 open() 系统调用是为我的应用程序执行此操作的好方法,但我想这样做而不必编译一个单独的共享库并将其与 LD_PRELOAD Hook 技巧(或使用 FUSE 并且必须有一个挂载目录)
我将自己 fork 进程,有没有一种方法可以在 fork 之前将 open() 重定向到我自己的函数,并让它在 exec() 之后保留在子进程中?
编辑:这背后的想法是我想通过中间进程 tee() 将数据从一个管道传输到所有其他管道来实现多读取器管道。我希望这对我的子进程是透明的,这样他们就可以获取一个文件名并打开()它,如果它是一个管道,我会返回它的文件描述符,而如果它是一个普通文件,我将把它传递给常规的 open() 函数。任何使它对子进程透明的替代方法都会很有趣。我不想编译必须预先链接的单独库。
最佳答案
我相信这里的答案是否定的,这是不可能的。据我所知,只有三种方法可以实现这一点:
- LD_PRELOAD 技巧,编译一个预加载的 .so 以覆盖系统调用
- 实现 FUSE 文件系统并将其中的路径传递给客户端程序,拦截调用。
- 使用 PTRACE 拦截系统调用,并根据需要修复它们。
2 和 3 将非常慢,因为它们必须拦截每个 I/O 调用并将返回交换到用户空间来处理它。可能比正常速度慢 500%。 1 需要构建和维护外部共享库以链接进来。
对于我的应用程序,我只是希望能够将路径传递给管道,我意识到我可以在我的进程中打开两端(通过 pipe()),然后获取读取路径以/proc//fd 结尾并将 that 路径传递给客户端程序,这为我提供了我认为需要的一切。
关于linux - 我可以在调用 fork 之前覆盖系统函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36536180/