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



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

我将自己分叉进程,有没有办法在分叉之前将open()重定向到我自己的函数,并在exec()之后将其持久化?

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

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

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

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

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

最新更新