我希望能够从我启动的任何子进程中截取具有特定前缀的文件名.这将是“pipe:// pipe_name”之类的名称.我认为包装open()系统调用对我的应用程序来说是一个很好的方法,但是我想这样做而不必编译一个单独的共享库并用LD_PRELOAD技巧(或者使用FUSE和有一个安装目录)
我将自己分配进程,有没有办法在分叉之前将open()重定向到我自己的函数,并在exec()之后将它保留在子进程中?
编辑:这背后的想法是我想通过中间进程tee()将数据从一个管道传输到所有其他管道来实现多读取器管道.我希望这对我的子进程是透明的,这样他们就可以获取文件名并打开()它,如果是管道,我会返回它的文件描述符,如果它是普通文件,我将它传递给常规的open()函数.任何可以做到这一点的方法都可以使子流程透明,这听起来很有意思.我不想编译一个必须预先链接的单独库.
解决方法
我相信这里的答案是否定的,这是不可能的.据我所知,实现这一目标的方法只有三种:
> LD_PRELOAD技巧,编译一个预先加载的.so来覆盖系统调用
>实现FUSE文件系统并将路径传递给客户端程序,拦截调用.
>使用PTRACE拦截系统调用,并根据需要进行修复.
2和3将非常慢,因为它们必须拦截每个I / O调用并交换回用户空间来处理它.可能比正常情况慢500%. 1需要构建和维护要链接的外部共享库.
对于我的应用程序,我只是希望能够传递到管道的路径,我意识到我可以在我的进程中打开两端(通过pipe()),然后去抓取读取端的路径/ proc // fd并将该路径传递给客户端程序,这给了我想到的一切.