2012-10-19 35 views
9

Tôi đang phát triển một máy chủ trong C với epoll library và tôi có câu hỏi về cách xử lý bộ nhớ cho struct epoll_event. Tôi đã nhận thấy trong một số ví dụ trực tuyến đó, khi thực hiện cuộc gọi epoll_ctl, lập luận events được cấp phát trên stack và sau đó con trỏ được thông qua, như vậy:Xử lý bộ nhớ với cấu trúc epoll_event

struct epoll_event ev; 
ev.events = EPOLLIN; 
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); 

Bây giờ tất cả chúng ta đều biết những gì xảy ra với ev khi chức năng trả về. Câu hỏi của tôi là: thư viện epoll có tạo bản sao của các giá trị này trong nội bộ hay không dựa trên cấu trúc mà bạn đã chuyển để được phân bổ heap? Ví dụ trên sẽ phá vỡ hoàn toàn việc thực hiện lò phản ứng của tôi? Nếu vậy, cách tốt nhất để theo dõi các heap của tôi được phân bổ epoll_event cấu trúc là gì?

Cảm ơn thời gian của bạn.

+0

Nếu "tất cả chúng ta đều biết điều gì xảy ra" thì tại sao bạn hỏi? –

+0

Khi tôi nói "tất cả chúng ta đều biết điều gì sẽ xảy ra", nghĩa là bộ nhớ được cấp phát sẽ được giải phóng khi hàm trả về. –

Trả lời

11

Mọi thứ đều ổn. Hàm epoll_ctl là một trình bao bọc đơn giản xung quanh một cuộc gọi hệ thống sẽ hoàn toàn hoàn thành khi hàm trả về. Không cần thêm dữ liệu từ không gian người dùng. Cấu trúc chỉ đơn giản là một cách để đóng gói các đối số.

7

Hoàn toàn ổn khi vứt bỏ ngay hoặc tái sử dụng cấu trúc epoll_event của bạn.

Hạt nhân sẽ sao chép các tham số ra khỏi cấu trúc epoll_event.

Điều này hoàn toàn giống như khi bạn sử dụng ioctl lấy cấu trúc làm tham số hoặc hoạt động ổ cắm (ví dụ: liên kết) lấy cấu trúc sockaddr_in.

Hạt nhân cần những gì nó cần và ngay lập tức bạn có thể giải phóng nó.

Điều duy nhất bạn cần phải lo lắng là "dữ liệu người dùng", chỉ có liên quan đến bạn. Hạt nhân sẽ lưu trữ nó, nhưng bạn cần phải biết nó có nghĩa là gì khi bạn nhận được một sự kiện.

+0

Cảm ơn bạn. Được thăng hạng. Tôi sẽ đánh dấu câu trả lời của Kerrek SB tuy nhiên, bởi vì anh ta đã trả lời khoảng một phút trước khi bạn. –

3

epoll là tập hợp các syscalls, không phải thư viện. Khi bạn gọi các syscalls epoll bạn nhập hạt nhân, và hạt nhân thường không tin tưởng các bộ đệm chế độ người dùng này nhất thiết phải hợp lệ hoặc dính xung quanh, mà là bản sao vào bộ nhớ hạt nhân qua copy_from_user v.v. vâng, bạn có thể thiết lập cấu trúc ngăn xếp, chuyển địa chỉ của chúng tới syscall, sau đó loại bỏ chúng sau khi nó trả về.

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