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并将该路径传递给客户端程序,这给了我想到的一切.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...