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

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

我将自己分叉进程,有没有办法将open()redirect到我自己的函数,然后在exec()之后让它继续留在孩子中?

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

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

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

2和3将非常缓慢,因为他们将不得不拦截每个I / O呼叫并交换用户空间来处理它。 可能比正常情况下慢500%。 1需要构建和维护外部共享库来链接。

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