2012-10-19 12 views
9

我正在使用epoll library在C中開發一個服務器,我對如何處理struct epoll_event的內存有個疑問。我也注意到,在作出epoll_ctl呼叫時,該events參數分配在堆棧上,然後將指針傳遞,像這樣一些網上的例子:使用struct epoll_event處理內存

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

現在大家都知道會發生什麼ev當函數返回。我的問題是:epoll庫是否在內部複製這些值,或者它是否依賴於您傳遞的堆被分配的結構?上面的例子會完全破壞我的反應堆實施嗎?如果是這樣,跟蹤我的堆分配epoll_event結構的最佳方式是什麼?

謝謝你的時間。

+0

如果「我們都知道發生了什麼」,那你爲什麼要問? –

+0

當我說「我們都知道發生了什麼」時,我的意思是當函數返回時釋放堆棧分配的內存。 –

回答

11

一切都很好。函數epoll_ctl是系統調用的簡單包裝,當函數返回時該函數將完全完成。用戶空間不需要其他數據。結構只是一個打包參數的方法。

7

立即丟棄或重用您的epoll_event結構是絕對沒問題的。

內核將複製epoll_event結構中的參數。

這與使用將結構作爲參數的ioctl或採用struct sockaddr_in的套接字操作(例如綁定)完全相同。

內核採用它所需的內容,並立即釋放它。

您唯一需要擔心的是「用戶數據」,它只與您有關。內核將存儲它,但是當你得到一個事件時你需要知道它的意思。

+0

謝謝。 Upvoted。然而,我會標記Kerrek SB的答案,因爲他在你之前約一分鐘回答。 –

3

epoll是一組系統調用,而不是一個庫。當你調用epoll系統調用時,你輸入內核,內核通常不會相信這些用戶模式緩衝區必須是有效的或停留,而是通過copy_from_user拷貝到內核內存等。所以是的,你可以設置結構堆棧將它們的地址傳遞給系統調用,然後在返回後丟棄它們。