Tôi đã quá tải cuộc gọi hệ thống fork()
và tạo phiên bản của riêng mình fork()
bằng RTLD_NEXT. Tức là, dlsym(RTLD_NEXT, fork)
. Điều này sẽ nhấn phiên bản của tôi của ngã ba. Sau này tôi muốn nhân rộng nhiệm vụ thực tế của cuộc gọi hệ thống fork()
, đó là, tạo ra quá trình con và trả lại pid, và một số chức năng bổ sung hơn.Quá tải ngã ba()
Tôi không thể tìm ra cách thực hiện điều đó. Tôi đã kiểm tra mã nguồn hạt nhân cho fork()
(fork.c) và không thể tìm ra nhiều.
Việc làm này:
dlsym(RTLD_NEXT,fork);
int fork(void) {
int pid=_fork(); // Trying to call actual fork does not work
return pid;
}
Làm thế nào tôi có thể làm điều đó? Dưới đây là liên kết tới kernel mã nguồn cho ngã ba: http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10
Chỉnh sửa (kéo từ bình luận):
tôi đang làm việc trên một sự rò rỉ công cụ phát hiện, và công cụ này phát hiện một đôi miễn phí khi một quá trình con xóa bộ nhớ được cấp bởi cha mẹ. Để khắc phục điều này, tôi sẽ ghi đè lên fork()
và bất cứ khi nào có fork()
, bảng phân bổ bộ nhớ của phụ huynh sẽ được nhân đôi với đứa trẻ.
Bạn có ý nghĩa gì bởi "không hoạt động"? Lỗi thời gian chạy? Lỗi trình biên dịch? – Simone
@Simone: _fork(); // Lỗi: _fork không được khai báo. Ý tưởng của tôi là để làm cho nó nhấn phiên bản hạt nhân thực tế của ngã ba và không phải của tôi. Hy vọng nó làm cho rõ ràng bây giờ. – kingsmasher1
Chính xác, bạn muốn đạt được điều gì bằng cách thực hiện việc này? Mục tiêu cuối cùng của bạn là gì? – Omnifarious