2014-04-28 11 views
6

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?

+0

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

Trả lời

1

Tôi ngạc nhiên vì nó hoạt động tốt như đã làm!

Bạn đang thay thế mục nhập thư viện C cho close(), chứ không phải cuộc gọi hệ thống. Tuy nhiên, các phần khác của thư viện C vẫn đang được sử dụng cho các chương trình đó. Có lẽ có một số liên kết trực tiếp đến 3 tập tin đầu tiên xử lý. Hãy xem nguồn của bất kỳ thư viện C nào bạn đang sử dụng.

2

Loại "thay thế" này chỉ hoạt động cho các chương trình được liên kết động.

Bất kỳ chương trình nào được liên kết thống kê với thư viện triển khai close -call sẽ không có "thay thế".

Trường hợp sau sẽ là trường hợp cho mỗi cuộc gọi đến close() ngoài thư viện thực hiện chính bản gốc close(). Và nó cũng có vẻ như là trường hợp của các mô tả tập tin tiêu chuẩn 0, 12 vì khả năng đóng nhiều nhất của chúng được triển khai trong cùng một thư viện, đó là việc triển khai libc đang được sử dụng.

Các vấn đề liên quan