Tôi đang cố gắng cung cấp chức năng close()
của riêng mình trong Linux. Tại sao? Bởi vì tôi chỉ phát hiện ra bạn có thể làm điều đó và nó có vẻ thú vị.Thay thế hàm close() trong Linux bằng hàm close() của riêng tôi
Dưới đây là myclose.c:
#include <stdio.h>
int close(int fd) {
printf("Closing fd: %d\n", fd);
return 0;
}
Dưới đây là makefile của tôi:
all: myclose.so my-close.so
%.so: %.o
gcc -shared -o [email protected] $<
%.o:%.c
gcc -c -fPIC -o [email protected] $<
clean:
rm -f *.so *.o
Sau khi biên soạn, tôi chạy:
export LD_PRELOAD=`pwd`/myclose.so
Sau đó, tôi chạy:
cat myclose.c
Kết quả tôi nhận được là:
#include <stdio.h>
int close(int fd) {
printf("Closing fd: %d\n", fd);
return 0;
}
Closing fd: 3
Yay! Hoạt động đúng không? Hầu hết. cat
gọi close()
nhiều lần, nhưng chúng tôi chỉ thấy một dòng đầu ra. Theo strace
(và thông thường), close()
cũng nên được gọi cho các bộ mô tả tập tin 1 và 2. Nếu tôi chạy cat *
và mèo tất cả các tệp trong thư mục, tôi thấy "Đóng fd: 3", "Đóng fd: 4", v.v ... lên tệp cuối cùng trong thư mục. Vì tất cả các mô tả tập tin này lớn hơn 2, tôi nghĩ có thể có vấn đề với việc đóng các mô tả tập tin đặc biệt (stdout và stderr). Tuy nhiên, khi tôi chạy ls
Tôi chỉ thấy đầu ra thông thường và không có dòng "Đóng fd:", có nghĩa là nó cũng không hoạt động cho ls
, mặc dù strace
hiển thị close(3)
khi chạy ls
.
Bất kỳ ý tưởng nào về điều gì có thể sai?
Tôi có thể hoàn toàn sai ở đây, nhưng không phải là trình bao chăm sóc FD 1 và 2? Bạn đã thử khởi chạy trình bao tải trước nó bằng "close()" chưa? – lorenzog