linux - 我可以在调用 fork 之前覆盖系统函数吗?

标签 linux

我希望能够从我启动的任何子进程中拦截带有特定前缀的文件名。这将是像“pipe://pipe_name”这样的名称。我认为包装 open() 系统调用是为我的应用程序执行此操作的好方法,但我想这样做不必编译一个单独的共享库并将其与 LD​​_PRELOAD Hook 技巧(或使用 FUSE 并且必须有一个挂载目录)

我将自己 fork 进程,有没有一种方法可以在 fork 之前将 open() 重定向到我自己的函数,并让它在 exec() 之后保留在子进程中?

编辑:这背后的想法是我想通过中间进程 tee() 将数据从一个管道传输到所有其他管道来实现多读取器管道。我希望这对我的子进程是透明的,这样他们就可以获取一个文件名并打开()它,如果它是一个管道,我会返回它的文件描述符,而如果它是一个普通文件,我将把它传递给常规的 open() 函数。任何使它对子进程透明的替代方法都会很有趣。我不想编译必须预先链接的单独库。

最佳答案

我相信这里的答案是否定的,这是不可能的。据我所知,只有三种方法可以实现这一点:

  1. LD_PRELOAD 技巧,编译一个预加载的 .so 以覆盖系统调用
  2. 实现 FUSE 文件系统并将其中的路径传递给客户端程序,拦截调用。
  3. 使用 PTRACE 拦截系统调用,并根据需要修复它们。

2 和 3 将非常慢,因为它们必须拦截每个 I/O 调用并将返回交换到用户空间来处理它。可能比正常速度慢 500%。 1 需要构建和维护外部共享库以链接进来。

对于我的应用程序,我只是希望能够将路径传递给管道,我意识到我可以在我的进程中打开两端(通过 pipe()),然后获取读取路径以/proc//fd 结尾并将 that 路径传递给客户端程序,这为我提供了我认为需要的一切。

关于linux - 我可以在调用 fork 之前覆盖系统函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36536180/

相关文章:

linux - 如何调试我的交叉编译的 Linux 内核?

linux - 如何判断库是否使用特定 GCC 版本编译

c - 如何让链接器报告它为给定函数链接到的位置

sql - 给出替换变量的别名

linux - Anjuta/Glade 教程还是更好的 IDE?

linux - bash 中的 "sed"命令

node.js - 'npm start' 错误

linux - 如何从源代码构建 libcurl-gnutls.so

c - 从 C++ 应用程序中确定最后一个背景 pid

linux - 从文件中提取数字