2012-10-19 9 views
9

私はepoll libraryでCでサーバを開発していますが、struct epoll_eventのメモリの扱いに関する質問があります。struct epoll_eventでのメモリ処理

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

は、今、私たちはすべてevに何が起こるかを知っている:私はepoll_ctl呼び出しを行う際に、events引数がスタックに割り当てられた後、ポインタが渡され、そのようないくつかのオンラインの例に気づきました関数が戻ります。私の質問です:epollライブラリは内部的にこれらの値のコピーを作成するか、ヒープ割り当てのために渡した構造体に依存していますか?上記の例は私の原子炉の実装を完全に破るだろうか?もしそうなら、epoll_event構造体に割り当てられた私のヒープを追跡する最良の方法は何ですか?

お時間をいただきありがとうございます。

+0

「私たちはすべて何が起こるか知っていれば」、なぜあなたは尋ねますか? –

+0

"私たちはすべて何が起こるかを知っている"と言いますと、関数が返ってくると、スタックに割り当てられたメモリが解放されます。 –

答えて

11

すべては問題ありません。 epoll_ctl関数は、システムコールの周りの単純なラッパーであり、関数が戻るときに完全に完了します。ユーザー空間からのそれ以上のデータは必要ありません。構造体は単に引数をパッケージ化する方法です。

7

epoll_event構造体をすぐに破棄したり再利用したりすることは絶対に賢明です。

カーネルはepoll_event構造体からパラメータをコピーします。

これは、構造体をパラメータとして取るioctl、またはstruct sockaddr_inをとるソケット操作(bindなど)を使用した場合とまったく同じです。

カーネルに必要なものがあり、すぐに解凍しても大丈夫です。

唯一気にする必要があるのは、「ユーザーデータ」です。このデータは、あなたにとってのみ関連しています。カーネルはそれを保存しますが、イベントが発生したときの意味を知る必要があります。

+0

ありがとうございます。 Upvoted。私はKerrek SBの答えを正しいとマークします。なぜなら、彼はあなたの前に約1分間答えてくれたからです。 –

3

epollは、ライブラリではなく、システムコールのセットです。 epollシステムコールを呼び出すときにカーネルを入力すると、カーネルはこれらのユーザモードバッファが必ずしも有効であるとかスティックを使わずに、カーネルメモリにcopy_from_userなどを使ってコピーします。そうです。それらのアドレスをシステムコールに渡し、それが戻ったらそれらを破棄します。

関連する問題