我希望能够从我启动的任何subprocess拦截具有特定前缀的文件名。 这将是像“pipe:// pipe_name”这样的名称。 我认为包装open()系统调用是为我的应用程序执行此操作的一个好方法,但我希望这样做, 而不必编译一个单独的共享库并使用LD_PRELOAD技巧挂钩(或使用FUSE有一个挂载的目录)
我将自己分叉进程,有没有办法将open()redirect到我自己的函数,然后在exec()之后让它继续留在孩子中?
编辑:这背后的想法是,我想实现多读者pipe道通过有一个中间过程tee()从一个pipe道的数据到其他所有。 我希望这对我的subprocess是透明的,这样他们可以获取一个文件名并打开(),如果它是一个pipe道,我将返回文件描述符,而如果它是一个普通的文件,我只是将它传递给常规的open()函数。 任何其他的方式来做到这一点,使其对儿童进程透明,将有趣的听到。 我想不必编译一个单独的库,但必须预先链接。
我相信这里的答案是否定的,这是不可能的。 据我所知,只有三种方法可以做到这一点:
2和3将非常缓慢,因为他们将不得不拦截每个I / O呼叫并交换回用户空间来处理它。 可能比正常情况下慢500%。 1需要构建和维护外部共享库来链接。
对于我的应用程序,我只希望能够通过一个管道的路径,我意识到我可以在我的过程中打开两端(通过管道()),然后抓住路径读取结束在/ proc // fd并将该路径传递给客户端程序,这给了我所需要的一切,我认为。