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

本文探讨了在Linux环境下创建自定义close()函数的过程及遇到的问题。作者通过编写C语言程序实现了这一函数,并使用LD_PRELOAD环境变量使其实现生效。然而,在实际应用中发现,该函数对于文件描述符1和2(标准输出和错误输出)并未按预期工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这是myclose.c:

#include 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

编译后,我运行:

export LD_PRELOAD=`pwd`/myclose.so

然后我跑:

cat myclose.c

我得到的输出是:

#include 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).

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值