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