16

epoll ライブラリを使用して C でサーバーを開発していますが、メモリがどのように処理されるかについて質問がありstruct epoll_eventます。epoll_ctlいくつかのオンラインの例で、呼び出しを行うときに、events引数がスタックに割り当てられてから、次のようにポインターが渡されることに気付きました。

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

evこれで、関数が返されたときに何が起こるかがわかりました。私の質問は: epoll ライブラリはこれらの値のコピーを内部的に作成しますか、それとも渡した構造体に依存してヒープが割り当てられますか? 上記の例は私のリアクターの実装を完全に壊しますか? もしそうなら、ヒープに割り当てられた構造体を追跡する最良の方法は何epoll_eventですか?

御時間ありがとうございます。

4

4 に答える 4

19

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

于 2012-10-19T21:03:51.490 に答える
11

epoll_event 構造体をすぐに破棄または再利用しても問題ありません。

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

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

カーネルは必要なものを受け取るので、すぐに解放できます。

心配する必要があるのは、あなただけに関連する「ユーザーデータ」だけです。カーネルはそれを保存しますが、イベントを取得したときにそれが何を意味するかを知る必要があります。

于 2012-10-19T21:05:15.687 に答える
5

epollライブラリではなく、システムコールのセットです。epollsyscallsを呼び出すと、カーネルに入ります。カーネルは通常、これらのユーザー モード バッファーが必ずしも有効であるか、固定されているとは信じていませんがcopy_from_user、などを介してカーネル メモリにコピーします。そうです、スタックに構造体を設定できます。 、それらのアドレスをシステムコールに渡し、システムコールが戻った後にそれらを破棄します。

于 2012-10-19T21:06:53.260 に答える