Linux 我可以在调用fork之前重写系统函数吗?

Linux 我可以在调用fork之前重写系统函数吗?,linux,Linux,我希望能够从我启动的任何子进程中截取带有特定前缀的文件名。这将是一个类似的名字“pipe://pipe_name". 我认为对我的应用程序来说,包装open()系统调用是一种很好的方法,但我希望这样做,而不必编译单独的共享库并使用LD_预加载技巧将其挂接(或者使用FUSE并安装目录) 我将自己对进程进行分叉,有没有办法在分叉之前将open()重定向到我自己的函数,并在exec()之后将其保留在子进程中 编辑:这背后的想法是,我希望通过中间进程tee()实现多个读卡器管道,将数据从一个管道传输到

我希望能够从我启动的任何子进程中截取带有特定前缀的文件名。这将是一个类似的名字“pipe://pipe_name". 我认为对我的应用程序来说,包装open()系统调用是一种很好的方法,但我希望这样做,而不必编译单独的共享库并使用LD_预加载技巧将其挂接(或者使用FUSE并安装目录)

我将自己对进程进行分叉,有没有办法在分叉之前将open()重定向到我自己的函数,并在exec()之后将其保留在子进程中


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

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

  • LD_PRELOAD技巧,编译一个。所以它是预加载的以覆盖系统调用
  • 实现一个FUSE文件系统,并将路径传递给客户端程序,拦截调用
  • 使用PTRACE拦截系统调用,并根据需要进行修复
  • 2和3将非常慢,因为它们必须拦截每个I/O调用并交换回用户空间来处理它。可能比正常速度慢500%。1需要构建和维护一个外部共享库来链接


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

    您可以控制您执行的进程吗?这是你的代码吗?理论上是的,但我想要一个适用于任何二进制文件的解决方案…我认为如果没有LD_预加载技巧,这是不可能的。使用它应该可以很好地工作。这也是我的想法,不过我真的不想建立一个单独的库。我正在尝试构建一个只包含标题的库。