微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我希望能够从我启动的任何子进程中截取具有特定前缀的文件名.这将是“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并将该路径传递给客户端程序,这给了我想到的一切.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐