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

gsi*_*011 6 c linux shared-libraries ld-preload

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

这是myclose.c:

#include <stdio.h>

int close(int fd) {
    printf("Closing fd: %d\n", fd);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的makefile:

all: myclose.so my-close.so

%.so: %.o
    gcc -shared -o $@ $<

%.o:%.c
    gcc -c -fPIC -o $@ $<

clean:
    rm -f *.so *.o
Run Code Online (Sandbox Code Playgroud)

编译后,我运行:

export LD_PRELOAD=`pwd`/myclose.so
Run Code Online (Sandbox Code Playgroud)

然后我跑:

cat myclose.c
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

#include <stdio.h>

int close(int fd) {
    printf("Closing fd: %d\n", fd);
    return 0;
}
Closing fd: 3
Run Code Online (Sandbox Code Playgroud)

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

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

wal*_*lyk 1

我很惊讶它的效果竟然如此之好!

您正在替换 close() 的 C 库条目,而不是系统调用。然而,C 库的其他部分仍在用于这些程序。可能有一些与前 3 个文件句柄的直接链接。查看您正在使用的 C 库的源代码。