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

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

概述我希望能够从我启动的任何子进程中截取具有特定前缀的文件名.这将是“pipe:// pipe_name”之类的名称.我认为包装open()系统调用对我的应用程序来说是一个很好的方法,但是我想这样做而不必编译一个单独的共享库并用LD_PRELOAD技巧(或者使用FUSE和有一个安装目录) 我将自己分配进程,有没有办法在分叉之前将open()重定向到我自己的函数,并在exec()之后将它保留在子进程中? 我希望能够从我启动的任何子进程中截取具有特定前缀的文件名.这将是“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并将该路径传递给客户端程序,这给了我想到的一切.

总结

以上是内存溢出为你收集整理的linux – 我可以在调用fork之前覆盖系统函数吗?全部内容,希望文章能够帮你解决linux – 我可以在调用fork之前覆盖系统函数吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1019406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存