用我自己的close()函数替换Linux中的close()函数

用我自己的close()函数替换Linux中的close()函数,第1张

概述我正在尝试在Linux中提供我自己的close()函数实现.为什么?因为我发现你可以做到这一点,听起来很有趣.这是myclose.c:#include <stdio.h> int close(int fd) { printf('Closing fd: %d\n', fd); return 0; } 这是我的makefile:al

我正在尝试在@L_419_0@中提供我自己的close()函数实现.为什么?因为我发现你可以做到这一点,听起来很有趣.

这是myclose.c:

#include 

这是我的makefile:

all: myclose.so my-close.so%.so: %.o    gcc -shared -o $@ $<%.o:%.c    gcc -c -fPIC -o $@ $

编译后,我运行:

export LD_PRELOAD=`pwd`/myclose.so

然后我跑:

cat myclose.c

我得到的输出是:

#include 

好极了!工作对吗?几乎. cat不止一次调用close(),但我们只看到一行输出.根据strace(和常识),也应该为文件描述符1和2调用close().如果我运行cat *并cat目录中的所有文件,我会看到“关闭fd:3”,“关闭fd:4”等,直到目录中的最后一个文件.由于所有这些文件描述符都大于2,我想可能在关闭特殊文件描述符(stdout和stderr)时存在问题.但是,当我运行ls时,我只看到常规输出而没有“关闭fd:”行,这意味着它对ls也不起作用,即使在运行ls时strace显示close(3).

关于什么可能出错的任何想法?

最佳答案这种“替换”仅适用于动态链接程序.

任何与实现close-call的库静态链接的程序都无法将其“替换”.

后者将是每次调用close()从实现原始close()本身的库中的情况.标准文件描述符0,1和2似乎也是如此,因为它们最有可能在同一个库中实现,即在使用的libc实现中.

总结

以上是内存溢出为你收集整理的用我自己的close()函数替换Linux中的close()函数全部内容,希望文章能够帮你解决用我自己的close()函数替换Linux中的close()函数所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)