gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:56:28 25 4
gpt4 key购买 nike

我试图在 Linux 中提供我自己的 close() 函数实现。为什么?因为我刚刚发现你可以这样做,而且听起来很有趣。

这是 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(和常识),也应该为文件描述符 1 和 2 调用 close()。如果我运行 cat * 并 cat 目录中的所有文件,我会看到“Closing fd: 3”、“Closing fd: 4”等,直到目录中的最后一个文件。由于所有这些文件描述符都大于 2,我认为关闭特殊文件描述符(stdout 和 stderr)可能存在问题。但是,当我运行 ls 时,我只看到常规输出,没有“Closing fd:”行,这意味着它对 ls 也不起作用,即使 strace 在运行 ls 时显示 close(3)

有什么可能出错的想法吗?

最佳答案

这种“替换”只适用于动态链接的程序。

任何静态链接到实现close 调用的库的程序都无法“替换”它。

后者将是每次从实现原始 close() 本身的库中调用 close() 的情况。标准文件描述符 012 似乎也是这种情况,因为它们的关闭很可能是在同一个文件中实现的库,即在正在使用的 libc 实现中。

关于c - 用我自己的 close() 函数替换 Linux 中的 close() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com