我正在尝试在Linux中提供我自己的close()函数实现.为什么?因为我发现你可以做到这一点,听起来很有趣.
这是myclose.c:
#include
@H_502_10@dio.h> int close(int fd) { printf("Closing fd: %d\n",fd); return 0; } 这是我的makefile:
all: myclose.so my-close.so %.so: %.o gcc -shared -o $@ $< %.o:%.c gcc -c -fPIC -o $@ $< clean: rm -f *.so *.o
@H_502_10@编译后,我运行:
export LD_PRELOAD=`pwd`/myclose.so
@H_502_10@然后我跑:
cat myclose.c
@H_502_10@我得到的输出是:
#include
@H_502_10@dio.h> int close(int fd) { printf("Closing fd: %d\n",fd); return 0; } Closing fd: 3 好极了!工作对吗?几乎. cat不止一次调用close(),但我们只看到一行输出.根据strace(和常识),也应该为文件描述符1和2调用close().如果我运行cat *并cat目录中的所有文件,我会看到“关闭fd:3”,“关闭fd:4”等,直到目录中的最后一个文件.由于所有这些文件描述符都大于2,我想可能在关闭特殊文件描述符(stdout和stderr)时存在问题.但是,当我运行ls时,我只看到常规输出而没有“关闭fd:”行,这意味着它对ls也不起作用,即使在运行ls时strace显示close(3).
关于什么可能出错的任何想法?
最佳答案
原文链接:https://www.f2er.com/linux/440665.html